전체 글 357

Golang의 기초

Go언어에 관하여 Go의 역사 GO언어는 2009년에 Google에서 만들어진 오픈 소스 프로그래밍 언어이다. 그리고 GO는 UTF-8을 기본 문자로 갖는다. Go의 특징 pakage Go는 1개의 main package와 여러 개의 다른 package를 가지고 있다. 원하는 기능을 가진 package를 가져와서 사용하면 된다. main은 시작점이기 때문에 따로 설정해 줄 수 없고 단 한개만을 사용한다. fmt는 function의 약자이다.(un -> m) fmt는 함수를 정의하기 위해 사용한다. 변수 변수란 값을 저장하는 메모리 공간을 가리키는 이름이다. 값을 저장하는 공간은 크게 하드디스크, memory 두개로 나뉜다. 하드디스크는 느리지만 프로그램이 종료되어도 데이터가 유지된다. memory는 빠르..

Golang - 고랭 이란??

프로그래밍 언어 프로그램이란? 원하는 명령을 원하는 순서대로 실행될 수 있도록 적어 놓은 문서를 뜻한다. 프로그래밍은 어떠한 명령을 실행할 때에 결국 컴퓨터 언어로 실행하게 된다. 정적 컴파일 언어, 동적 컴파일 언어 이 컴퓨터 언어로의 변환 시점에 따라 정적 컴파일 언어와 동적 컴파일 언어로 나뉘게 된다. 정적 컴파일 언어 C, C++, Go 정적 컴파일 언어는 Code를 실행하기 전에 미리 기계어로 변환시킨다.(실행 파일 생성) 이 방식의 장점은 미리 기계어로 변환시켜두었기 때문에 한번 변환하게 되면 속도가 빠르게 사용할 수 있다. 동적 컴파일 언어 JS, python 등등.. 추가로 Java가 동적 컴파일 언어라고 나와있어서 이상해서 찾아 보았는데, java는 동적/정적의 특성을 모두 가지고 있는 ..

lucy필터로 xss 방어하기(feat JSON, time, 이모지)

서비스를 실제로 운영할 때에 공격이 들어올 수 있고, 이를 막기 위해 노력해야 한다. 디프만에서 우리는 모든 DB통신을 JPA와 querydsl을 통해 진행했기 때문에 SQL injection은 막을 수 있었다. 그러나 XSS의 경우는 추가적인 방어가 필요했다. 이를 위해 lucy filter를 도입하였고, 우리 프로젝트에 맞춰 추가적인 기능을 부여하며 여러 테스트를 해 보았다. lucy필터의 장점 https://github.com/naver/lucy-xss-filter 네이버에서 만든 XSS 방어용 필터이다. 이를 사용하면 XML설정만으로 XSS방어가 가능해진다. 비지니스 레이어의 코드 수정이 필요하지 않다. 직접 설정할 필요가 없으므로 코드를 잘못 입력하거나, 놓치고 적용하지 않는 경우가 없다. lu..

컬렉션 페치조인과 페이징 하기(feat. batch size)

디프만 프로젝트에서 댓글 관련 API중 하나를 담당했는데, 해당 내용은 어떤 맥주를 통해 이곳에 작성된 모든 기록들을 받아오고, 동시에 저장된 맛(최대 3개)를 가져와 보여준다. 그리고 여기 페이징을 적용한다. 였다. 즉 이 경우 기록 -> 맛을 가져올 때 일대다 조인이 생기게 된다. 맥주를 통해 기록을 가져옴(여기서 N개의 기록을 가져옴) 해당 기록에 있는 맛태그를 가져옴(최대 3개의 맛태그) 맛태그를 통해 맛을 가져옴(다대일) 2, 3번의 로직을 수행할 때에 문제가 여러개 생기게 된다. 먼저 일대다 조인의 경우 페치 조인만으로 페이징을 할 수 없다. 알다시피 일대다 조인을 페치조인하면 동일한 데이터가 여러 번 출력되어 데이터가 뻥튀기된다!! 그리고 비효율적인 쿼리가 생성되게 된다. 하나의 기록마다 맛..

페치 조인과 그 한계에 관하여

실무에서 매우 중요하다. SQL의 조인 종류에 해당하지는 않는다. JPQL에서 성능 최적화를 위해 제공하는 기능이다. 연관된 엔티티나 컬렉션을 SQL한 번에 조회하는 기능. join fetch 명령어 사용 예를 들어 회원을 조회하면서 연관된 팀을 함께 조회하려 한다(SQL한번에) select m from Member m join fetch m.team -> SELECT M., T. FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID=T.ID 아래와 같이 inner join을 사용하여 Team이 있는 member들을 가져온다고 가정한다면 JpaMain public class JpaMain { public static void main(String[] args){ EntityMa..

FetchType Eager vs Lazy

JPA에서는 여러 엔티티가 서로 연관되어 있을 때에, 하나의 엔티티에서 다른 엔티티를 두가지 방법으로 찾는데, 간단히 말하면 해당 엔티티를 검색할때 바로 찾거나(Eager) 혹은 해당 엔티티를 사용할 때 찾거나(Lazy) 로 나뉜다. 이 내용들에 관해서 알아보도록 한다. LAZY전략 FetchType.LAZY 지연 전략이라고도 한다. fetchType을 LAZY로 설정하면, 이 지연로딩의 대상이 된 쪽은 프록시 객체로 가져오게 된다. 그리고 이후에 해당 대상을 실제로 사용하려 할 때에 초기화가 진행된다. XToMany의 기본 속성이 LAZY로 되어 있다. Eager전략 FetchType.EAGER 즉시 전략이라고도 한다. fetchType을 EAGER로 설정하면, 로딩할 때에 모든 값을 join하여 가져..

JPA의 프록시란?

프록시 JPA에서는 검색할 때에 em.find()말고도 em.getReference()라는 메소드를 제공한다. 이 em.getReference()는 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체를 조회한다. -> 즉 DB에 쿼리가 나가지 않은 상태로 객체를 조회한다. 코드를 통해 확인해 보자면 Member클래스에서 필요없는거 없애기 @Entity public class Member extends BaseEntity { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; public Long getId() { return id; } public..

Git - Github decktop을 통해 협업하기!!

Git - Github decktop을 통해 협업하기!! 디프만을 통해 최근 프로젝트를 진행하고 있고, 혼자서 공부하던 것에 비해 적용해야 할 것이 많았다. 동아리를 통해 여러 방법을 통해 다른 사람들과 협업하는 것에 배울 수 있었는데, 이 내용에는 Notion, Slack, Kanban등 많은 것들이 있지만 이번에는 Git에 관한 것을 중점적으로 다루려 한다. 공통 개발 저장소 만들고 함께 사용하기 나는 백엔드 팀의 일원이고 동일한 백엔드 직무의 사람들과 함께 개발을 진행해야 한다. 그렇기 때문에 여러 백엔드 팀원이 하나의 프로젝트를 관리하기 위해 공통 개발 저장소를 사용해야 한다. 먼저 함께할 repository를 만든다. 참고로 동아리에서는 이미 동아리 명의로 되어있는 Organizations이 있..

기타 2022.06.12

XSS와 sql injection에 관하여

XSS와 sql injection에 관하여 SQL Injection이란?? 먼저 SQL Injection이란, 이름 그대로 보안상의 취약점을 이용하여 임의의 SQL문을 주입하여 DB에서 이 SQL이 실행되도록 하는 공격이다. 이 SQL Injection은 OWASP Top10중 첫번째에 해당한다. 공격 방법이 간단하고, 이게 성공할 경우 큰 피해를 받게 되는 공격이다. 어떤 공격인지 예를 들어보자면 공격 방법 예를 들어 user_id user_pass RyooChan 1q2w3e! Michael Jordan bulls23 Magic Johnson Lakers32 위와 같은 유저 정보를 가진 테이블이 있다고 할 때 SELECT user FROM user_table where user_id = '[1..

이론 정리 2022.06.11

대규모 시스템 설계 공부 008

URL 단축기 설계 1단계 문제 이해 및 설계 범위 확정 질문 결과 기본적 기능이 아래와 같다고 한다. URL단축 : 주어진 긴 URL을 훨씬 짧게 줄인다. URL리디렉션 : 축약된 URL로 HTTP 요청이 오면 원래 URL로 안내 높은 가용성과 규모 확장성, 그리고 장애 감내가 요구됨 개략적 추정 쓰기 연산 : 매일 1억 개의 단축 URL생성 초당 쓰기 연산 : 1억/24/3600=1160 읽기 연산 : 읽기 연산과 쓰기 연산 비율은 10:1이라고 하자. 그 경우 읽기 연산은 초당 11600회 발생한다. URL단축 서비스를 10년간 운영한다고 가정하면 1억X365X10=3650억 개의 레코드를 보관해야 한다. 축약 전 URL의 평균 길이는 100이라고 하자 따라서 10년동안 필요한 저장 용량은 3650..