[Spring] @Pattern과 @Valid를 이용한 유효성 검증
·
spring, jpa
개요 지금까지 사용자의 아이디, 비밀번호를 검증하는 코드를 Service 레이어에서 조건문을 이용해 작성했었다. 부트캠프 멘토님의 테스트 코드를 분석하면서 @Pattern과 @Valid를 이용해 입력값을 검증할 수 있다는 사실을 알게되었고 Service 레이어의 코드를 줄이고 예외처리의 가독성이 높아지는 것에 매력을 느껴 해당 방식을 사용하기로 결정하였다. 해당 방식의 사용 방법을 알아보자. DTO에서 @Pattern 사용 @Pattern은 DTO레벨에 정규표현식과 함께 선언해주면 되는데 이를 이용하기 위해서는 아래와 같이 dependency를 추가해야한다. implementation 'org.springframework.boot:spring-boot-starter-validation' 다양한 방면에서..
[Spring] 단위테스트(Unit Test)
·
spring, jpa
JUnit Test 기본 기능들 @BeforeEach @AfterEach @BeforeAll @AfterAll @Nested @DisplayName("주제 별로 테스트를 그룹지어서 파악하기 좋습니다.") class Test1 { @Test @DisplayName("Test1 - test1()") void test1() { System.out.println("Test1.test1"); } @Test @DisplayName("Test1 - test2()") void test2() { System.out.println("Test1.test2"); } } @Nested @DisplayName("Test2 다른 주제") class Test2 { @Test @DisplayName("Test2 - test1()") ..
[Spring] @Builder를 이용한 DTO 생성
·
spring, jpa
목표Spring기반의 익명 게시판 서버만들기 과제를 진행했다. 과제를 제출하고 멘토님께서 코드리뷰를 해주셨는데 그 중 DTO에 @AllArgsConstructor보다는 생성자 레벨의 @Builder를 이용하는것을 권장한다는 내용이었다. 이번 글을 통해 Builder가 무엇인지, 왜 @AllArgsConstructor가 아닌 @Builder의 사용을 권장하는지 그 이유에 대해 알아보고자 한다.  Builder Pattern누구나 한 번쯤은 객체를 생성하기위해 생성자에 많은 매개변수를 입력하다가 데이터를 잘못 전달했다거나, 객체 필드의 수정이 이루어질때마다 생성자를 변경해 기존 코드를 수정했다거나, 객체 생성을 위해 필요하지 않은 데이터를 억지로 집어넣는 등 객체 생성자와 관련하여 겪은 다양한 경험이 있..
[JPA] 복합키
·
spring, jpa
@Embeddable을 이용한 PK 테이블 생성 SNS 백엔드 서버의 팔로우 기능을 구현하면서 서로 다른 유저의 관계를 Follow 테이블로 묶어야 하는 일이 발생했다. 저번 프로젝트에서 멘토님이 이런 경우 복합키를 사용하는 것을 추천해주셨는데 이번에 적용해보기로 했다. 복합키는 아래와 같이 PK테이블을 별도로 만들어 사용하면 되는데 @Embeddable을 이용해 구성할 수 있다. 아래와 같이 관계를 엮을 두개의 키를 선언해주면 되고 해당 FollowPK를 이용하는 Follow 테이블은 기존 방식처럼 follow_id를 가지는 것이 아니라 아래처럼 두개의 id를 PK로 가지게 되는 것이다. @Embeddable @EqualsAndHashCode @NoArgsConstructor(access = Acces..
[JPA] 즉시로딩과 지연로딩
·
spring, jpa
목표 Jpa 즉시로딩과 지연로딩의 개념에 대해 알아보자. 즉시로딩과 지연로딩의 개념을 이해하기 위해서는 Jpa Proxy 객체 개념의 이해가 선행되어야 한다. Proxy에 대한 이해가 없다면 JPA Proxy란? 을 먼저 보면 좋을 것 같다. 즉시로딩(EAGER)과 지연로딩(LAZY) 즉시로딩(EAGER Loading) Hibernate는 지연로딩과 즉시로딩, 두 가지 로딩 전략을 제공하는데, 즉시로딩은 연관된 엔티티를 한 번의 쿼리로 함께 로딩하는 방식을 말한다. 즉시로딩을 사용하면, Entity와 연관된 모든 Entity들이 한 번에 로딩되므로, 필요한 데이터를 즉시 사용할 수 있다. 연관관계 annotation 속성에 "fetch = FetchType.EAGER"를 추가하여 사용할 수 있다. 예를 ..
[SQL] UNION과 UNION ALL
·
database, sql
Table간의 합연산 UNION UNION의 개념은 매우 쉽다. Table간의 합연산인데 A테이블과 B테이블의 합집합 테이블인 C테이블을 만드는 것이라고 보면 된다. 또한, UNION은 연산시 중복제거, 정렬 기능을 제공한다. 예제를 보면서 차근차근 이해하는게 훨씬 쉬우니 아래 두개의 테이블을 시작으로 서로 비교해가면서 UNION에 대해 이해해보도록 하자. 아래와 같이 Column이 모두 같은 user1, user2 테이블이 있다. 두 테이블을 합치려면 어떻게 해야할까? 아래와 같이 두개의 테이블에 UNION을 사용하면 된다. user1과 user2의 인스턴스가 모두 합해져 잘 출력되는것을 볼 수 있다. SELECT * FROM USER1 UNION SELECT * FROM USER2; ✅ Column의..
[SQL] SQL의 종류
·
database, sql
DML(Data Manipulation Language) 데이터 조작어 데이터 조작어로는 SELECT, INSERT, UPDATE, DELETE가 있는데 개발을 하면서 가장 많이 접했던 언어가 DML이지 않을까 싶다. 하나씩 기본적인 형식으로 사용해보면서 개념을 익혀보자. 아래 내용을 쭉 읽으면 DML은 테이블의 인스턴스에 대한 CRUD를 담당하는 문법이라고 생각이 들것이다. ✅ SELECT 먼저 SELECT이다. 테이블 안에서의 데이터를 조회하는 문법인데 모두가 한번쯤 사용해보지 않았을까 싶다. 아래와 같은 형식으로 사용한다. SELECT에 사용할 수 있는 WHERE, JOIN, GROUP BY 등이 있지만 해당 글에서의 설명하려는 내용이 아니기 때문에 생략한다. SELECT [COLUMN] FROM ..
[Algorithm] Combination - 조합
·
algorithm
개요 알고리즘 문제를 풀면서 대진표를 짜는 문제를 마주한적이 있었는데 무작정 중첩 for문을 돌렸던 기억이 있다. 당연히 코드는 엉망이 되었고 문제도 겨우겨우 풀어서 제출했었는데 이번에 조합을 구하는 문제를 풀어보면서 조합을 구하는 알고리즘을 제대로 정리해야겠다는 생각이 들었다. 재귀를 이용한 조합 알고리즘을 이해하고 언제든 활용할 수 있도록 정리해보도록 하자 Combination 구하기 조합은 nCr에 대한 내용만 이해하고 있다면 재귀를 이용해 손쉽게 구현할 수 있다. 코드상으로 조합의 대상이되는 n의 크기를 가진 배열과 깊이 r의 재귀를 이용해 nCr, n개의 원소 중 r개를 중복없이 선택하는 조합을 만들 수 있다. A, B, C, D, E 5개의 팀이 있다고 할때, 모든 팀이 다른팀과 1번씩..
[Algorithm] 약수·최대공약수·최소공배수
·
algorithm
목표 알고리즘 문제를 풀면서 약수·최대공약수·최소공배수를 구하는 문제를 만났는데 기본적으로 구현을 할 수는 있지만, 관련 공식을 쓰지 않아 매우 비효율적으로 답을 찾고 있다는 것을 깨달았다. 약수·최대공약수·최소공배수를 구하는 경우는 생각보다 자주 보이기때문에 이 기회에 정리해두려고 한다. 해당 문제를 만나면 공식을 쓸 수 있도록 이해하고 코드로 정리해보자. 약수(Divisor) 구하기 12의 약수를 구한다고 할때, 처음 약수를 구할때는 아래와 같이 1부터 12까지 반복문을 돌려서 나머지가 0이되는 숫자를 찾는 식으로 접근했다. 하지만, 이렇게 접근하면 O(n)의 시간복잡도를 가지게 되는데 n이 커지고 문제가 복잡해진다면 분명 매우 큰 시간을 잡아먹을 것이다. List divisor = new Arr..