Spring, JPA

Spring, JPA

엑셀파일 다운로드 기능 구현

개요최근 새로 개발하는 서비스에서 사용자별 정산내역을 엑셀파일로 다운로드할 수 있는 기능을 담당해 개발하게 되었다. 서치를 좀 해보니 "POI" 이라는 아파치 라이브러리를 이용해 엑셀파일을 Java에서 구성할 수 있다는 것을 알 수 있었다. 처음에는 정산내역에서 제공해야하는 데이터 양식에 맞춰 하드코딩한 메서드를 구현하려 했으나, 정산내역 이외의 도메인에서도 엑셀파일을 다운로드 해야하는 이슈가 있었고 유틸리티 클래스를 만들어 전달받는 리스트에 동적으로 대응할 수 있는 메서드를 만들고자 하는 욕심이 생겼다. 본 글에서 그 과정과 배운 내용들을 기록해두고자 한다.  아파치 POI 라이브러리Apache POI는 Apache에서 만든 라이브러리로 MS오피스(엑셀, 워드 등) 파일을 자바 언어로 읽고 쓰는 기..

Spring, JPA

[Spring] nGrinder를 이용한 대용량 데이터 부하테스트

nGrinder 설치 및 실행 (로컬 환경) nGrinder를 로컬에서 구동하는 이유는 처음 Docker를 이용해 테스트하려고 했으나 M1 환경을 지원하는 nGrinder Docker 이미지가 존재하지 않고 JDK 설정 등 Docker로 할 경우 호환성 문제가 많아 로컬 환경에 controller와 agent를 다운로드 받아 진행했다. 아래 nGrinder 공식 깃헙에서 controller war 파일을 다운받아 실행한다. GitHub - naver/ngrinder: enterprise level performance testing solution enterprise level performance testing solution. Contribute to naver/ngrinder development..

Spring, JPA

[JPA] JPA 지연로딩과 N+1 문제

JPA 즉시로딩과 지연로딩 즉시로딩: Entity를 불러올때 연관된 Entity를 즉시 fetch해서 함께 불러온다. 지연로딩: 연관된 Entity가 필요할때 fetch해서 불러온다. //default 로딩 전략은 FetchType.EAGER @ManyToOne(fetch = FetchType.LAZY) @OneToOne(fetch = FetchType.LAZY) Entity 1개 조회할때 @Test @Transactional void findOne() { //fetchType이 EAGER일때: findOne을 호출하면 team도 함께 1차 캐시에 올라온다. -> query 총 1번 //fetchType이 LAZY일때: //findOne을 호출하면 user를 가져오기 위한 query 1번이 실행되고 fe..

Spring, JPA

[Spring] Spring AOP

Spring AOP(Aspect-Oriented Programming) Spring AOP에서 AOP는 Aspect-Oriented Programming으로 관점 지향 프로그래밍을 의미한다. 관점 지향 프로그래밍이란 관심사를 적절히 나누자는 것인데 AOP에서는 이를 공통 관심 사항(cross-cutting concern)과 핵심 관심 사항(core concern)으로 분리한다. AOP라는 말에서 OOP와 대치될 것 같다는 느낌을 받을 수 있지만, 전혀 그렇지 않고 AOP는 오히려 더욱더 OOP의 관점으로 프로그래밍 할 수 있도록 도와준다. Spring AOP 예제 - 메소드의 호출 시간 측정 AOP에 대해 공부하면서 많은 자료를 찾아봤는데 거의 모든 자료에서 AOP의 예제로 메소드의 호출 시간을 측정하는..

Spring, JPA

[JPA] ORM 표준 JPA의 탄생 배경

ORM(Object-Relational Mapping) ORM이란 말그대로 객체와 관계형 데이터베이스를 직접 매핑해 사용하는 전략을 말한다. Spring을 이용하면 @Entity를 이용해 객체와 실제 RDB의 테이블을 매핑해 개발하는데 이러한 방식이 ORM 전략을 따르는 것이다. 자바에서는 이러한 ORM의 표준 명세로 JPA(Java Persistance API)를 사용하고 있다. JPA(Java Persistance API) JPA는 위에서 설명한바와 같이 자바에서 제공하는 인터페이스로 어떤 기능을 제공하는 라이브러리가 아니다. JPA는 ORM 전략을 따르는 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지에 대해 정의한 기술 명세서이다. JPA와 같이 Hibernate에 대해서도 많이..

Spring, JPA

[Spring] @Pattern과 @Valid를 이용한 유효성 검증

개요 지금까지 사용자의 아이디, 비밀번호를 검증하는 코드를 Service 레이어에서 조건문을 이용해 작성했었다. 부트캠프 멘토님의 테스트 코드를 분석하면서 @Pattern과 @Valid를 이용해 입력값을 검증할 수 있다는 사실을 알게되었고 Service 레이어의 코드를 줄이고 예외처리의 가독성이 높아지는 것에 매력을 느껴 해당 방식을 사용하기로 결정하였다. 해당 방식의 사용 방법을 알아보자. DTO에서 @Pattern 사용 @Pattern은 DTO레벨에 정규표현식과 함께 선언해주면 되는데 이를 이용하기 위해서는 아래와 같이 dependency를 추가해야한다. implementation 'org.springframework.boot:spring-boot-starter-validation' 다양한 방면에서..

Spring, JPA

[Spring] 단위테스트(Unit Test)

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, JPA

[Spring] @Builder를 이용한 DTO 생성

목표Spring기반의 익명 게시판 서버만들기 과제를 진행했다. 과제를 제출하고 멘토님께서 코드리뷰를 해주셨는데 그 중 DTO에 @AllArgsConstructor보다는 생성자 레벨의 @Builder를 이용하는것을 권장한다는 내용이었다. 이번 글을 통해 Builder가 무엇인지, 왜 @AllArgsConstructor가 아닌 @Builder의 사용을 권장하는지 그 이유에 대해 알아보고자 한다.  Builder Pattern누구나 한 번쯤은 객체를 생성하기위해 생성자에 많은 매개변수를 입력하다가 데이터를 잘못 전달했다거나, 객체 필드의 수정이 이루어질때마다 생성자를 변경해 기존 코드를 수정했다거나, 객체 생성을 위해 필요하지 않은 데이터를 억지로 집어넣는 등 객체 생성자와 관련하여 겪은 다양한 경험이 있..

Spring, JPA

[JPA] 복합키

@Embeddable을 이용한 PK 테이블 생성 SNS 백엔드 서버의 팔로우 기능을 구현하면서 서로 다른 유저의 관계를 Follow 테이블로 묶어야 하는 일이 발생했다. 저번 프로젝트에서 멘토님이 이런 경우 복합키를 사용하는 것을 추천해주셨는데 이번에 적용해보기로 했다. 복합키는 아래와 같이 PK테이블을 별도로 만들어 사용하면 되는데 @Embeddable을 이용해 구성할 수 있다. 아래와 같이 관계를 엮을 두개의 키를 선언해주면 되고 해당 FollowPK를 이용하는 Follow 테이블은 기존 방식처럼 follow_id를 가지는 것이 아니라 아래처럼 두개의 id를 PK로 가지게 되는 것이다. @Embeddable @EqualsAndHashCode @NoArgsConstructor(access = Acces..

Jisung Jung
'Spring, JPA' 카테고리의 글 목록