inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[인프런 워밍업 클럽 BE 2기] 백엔드 프로젝트 - 2주차 발자국

vin
0

1주차에는 간단한 엔티티와 프로젝트 구조 작성을 완료하고, 이번 주에는 리포지토리, DTO, 서비스 계층을 전반적으로 개발했으며, 그 과정에서 테스트 코드도 함께 작성했다. 이를 통해 프로젝트의 핵심 기능들을 구조화하고, 안정성을 높이는 데 중점을 두었다.

 

데이터를 다루는 리포지토리 개발하기

리포지토리 개발을 하였으며 역시 1주차와 달리 혼동스러운 어노테이션 및 개념과 처음 접하는 어노테이션 및 개념들이 나왔었다. 하나하나 상세히 어떤 역할을 하는지 강의에서 알려주셔서 따라가는데 문제 없었으나, 중간에 오류가 한번 발생하여 찾아보니 JPA영속성 관련 부분이였다.

Projectskill에 데이터가 들어가지 않아 확인을 해보니 project 엔티티에서 skill 부분에 cascade 부분을 빼먹어서 함께 저장이 되지 않았다.

1. Spring Component와 Bean 등록

2. 스프링 프로파일과 @Profile 어노테이션

3. 생성자 주입과 Bean 관리

4. 로그 사용 권장

5. JPA와 영속성 관리 (Cascade)

6. JPA 성능 개선 (findById 오버라이딩)

이러한 요소들은 스프링 애플리케이션 개발에서 빈 관리, 의존성 주입, JPA를 통한 데이터베이스 영속성 관리를 포함한 다양한 개발 과정에서 중요한 역할을 합니다.

 

리포지토리 테스트 하고 성능 개선하기

개발한 리포지토리가 제대로 작성 되는지 테스트코드를 작성하였으며, 또한 리포지토리의 성능을 개선하기 위해 JPQL을 따로 작성하여 fetch 전략으로 LAZY를 사용하여도 깔끔하게 출력되게 개선하였다.

  1. 리포지토리 테스트 코드 작성

    • @TestInstance.Lifecycle.PER_CLASS: 메서드 간 독립적인 실행이 가능하며, 메서드 간 의존성이 제거됨.

    • 의존성 주입: 테스트 시 필요한 리포지토리나 서비스 등을 주입받아 테스트를 진행.

       

    • 테스트 데이터 초기화: @BeforeAll을 사용하여 테스트에 필요한 데이터를 사전 생성.

     

  2. 프록시 객체와 Fetch 전략

    • 프록시 객체: JPA에서 연관된 엔티티를 가짜 객체로 생성하여 필요할 때만 데이터베이스에서 불러옴.

    • LAZY 로딩: 필요할 때마다 쿼리를 날려 데이터를 가져옴. 하지만, 반복문을 돌 때마다 SELECT 문이 나가 성능 저하가 발생할 수 있음.

    • EAGER 로딩: 한 번에 모든 연관된 엔티티를 조회하지만, 불필요한 데이터를 미리 가져올 경우 성능에 영향을 미칠 수 있음.

    3. Fetch Join과 N+1 문제 해결

    • Fetch Join: JPQL에서 사용하여 연관된 엔티티를 한 번의 쿼리로 모두 조회하는 방법.

      • 장점: 추가적인 쿼리가 발생하지 않아 성능 최적화가 가능.

      • 단점: 필요 없는 데이터를 미리 가져올 경우 메모리 낭비 가능.

    • N+1 문제: Lazy 로딩 시 발생하는 성능 문제로, 하나의 엔티티를 조회할 때 연관된 엔티티를 각각 추가 쿼리로 조회하여 비효율이 발생. Fetch Join으로 이 문제를 해결 가능.

       

       

      4.Assertions의 assertThat

    • assertThat: 테스트 코드에서 검증을 위한 메서드로, 다양한 조건에 맞는 검증을 수행할 수 있음.

      • isEqualTo(): 두 값이 같은지 비교.

      • isTrue() / isFalse(): 조건이 참인지, 거짓인지 확인.

      • hasSize(): 리스트나 배열의 크기를 검증.

      • contains(): 리스트가 특정 값을 포함하는지 확인.

데이터를 조회하고 변환하는 서비스 개발하기

도메인 패키지와 연결된 presentation 패키지를 생성하였고, 해당 패키지 안에 클래스, DTO, 리포지토리, 서비스 개발을 완료하였다. 또한, 서비스에 대한 테스트 코드도 작성했다.

이번에는 도메인에서 개발했던 리포지토리 테스트와 달리 단위 테스트가 아닌 방법으로 개발하였다. 기존까지 나는 개발 환경에서 페이지를 띄운 후 하나하나 수동으로 테스트를 진행했지만, 이러한 방식은 운영 서버에서 테스트하기 어렵다는 단점이 있었다.

따라서 테스트 코드를 작성하여 자동화된 방식으로 테스트하는 것이 실무적으로 더 안정적이라고 한다.

1. @RestController로 REST API 구현

2. @GetMapping@RequestMapping

3. DTO (Data Transfer Object)

4. Mockito와 @InjectMocks로 의존성 주입

미션 3

이번 미션에서는 설계한 테이블을 기반으로 REST API를 설계하는 작업을 진행했다. 상품 API, 분류 API, 브랜드 API, 재고 API를 설계했으며, 각 API의 기능을 세부적으로 구현하였다.

또한, HTTP 메서드 중 PUT과 PATCH 메서드의 차이점에 대해 고민했는데, 두 메서드의 차이는 다음과 같다:

https://github.com/Malvin222/mission-backoffice

 

웹 개발 백엔드 웹개발 워밍업클럽 스프링 나만의포트폴리오사이트만들기

답변 0