본문 바로가기

Back-End/Spring MVC43

MapStruct 구현체의 분석과 DTO에서 필요한 Lombok 애너테이션 Mapper는 DTO 클래스와 엔티티 클래스를 서로 변환해 주는 변환자이다. 계층간 역할 분리를 위해 사용한다. Mapper의 한 종류인 MapStruct는 컴파일 타임에 매핑 구현체를 모두 생성한다. DTO를 Inner class로 관리하던 중에 각 Inner class에 어떤 Lombok 애너테이션을 붙여야 하는지 판단이 되지 않아서 DTO 클래스와 MapStruct가 생성하는 구현체 코드를 분석하여 정리했다. 🪄 MapStruct가 매핑을 정상적으로 하기 위한 우선 순위 조건 Builder 패턴이 적용된 경우 모든 필드를 파라미터로 가지는 생성자가 있을 경우 👉 이때 기본 생성자가 포함되어 있으면 제 역할을 하지 못한다. setter 메서드가 있는 경우 1. RequestBody → Member R.. 2022. 10. 20.
[Spring Boot] JUnit으로 단위 테스트(Unit Test) 코드 작성하기 📗: 인터페이스, 📄: 클래스 helper ㄴ 📗 ControllerTestHelper : HttpMethod에 따라 요청 메서드 생성, URI 반환 ㄴ 📗 MemberControllerTestHelper : Member 컨트롤러에 대한 URI를 호출할 수 있도록 연결 ㄴ 📄 StubData : Map으로 HttpMethod에 따라 Dto 객체를 생성하여 반환 controllerTest ㄴ 📄 MemberControllerTest : helper를 활용하여 테스트 수행 단위 테스트 코드를 작성할 때 아래 두 가지의 라이브러리가 사용된다. JUnit5: 자바 단위 테스트를 위한 테스팅 프레임워크 AssertJ: 자바 테스트를 돕기 위해 다양한 문법을 지원하는 라이브러리 단위 테스트는 given - when.. 2022. 9. 18.
애플리케이션 빌드 / 실행 / 배포 애플리케이션을 서버 환경에서 실행하려면 Gradle이나 Maven 같은 빌드 툴로 빌드하는 과정이 필요하다. 빌드 🌳 IntelliJ IDE Gradle 탭 > 프로젝트 이름 > Tasks > build > :bootJar 또는 :build task build/libs 디렉토리에 Jar 파일(로컬 PC에서 실행 가능한 파일)이 생성된다. :build : :assemble, :check 같이 Gradle에서 빌드와 관련된 모든 task를 실행한다. 실행 가능한 Jar 파일 외에 plain Jar 파일이 하나 더 생성된다. :bootJar : 모든 task를 실행하는 것이 아니라 실행 가능한 Jar 파일을 생성하기 위한 task만 실행된다. 🌳 Gradle Task Window 터미널 PS D:project.. 2022. 9. 16.
[Spring Boot] JUnit을 이용하여 테스트 코드 작성하기 (feat. Mockito) 단위 테스트(Unit Test): 비즈니스 로직에서 사용하는 각각의 메서드를 독립적으로 테스트한다. 슬라이스 테스트: 애플리케이션을 특정 계층으로 쪼개어 하는 테스트로, Mock 객체를 사용한다. 통합 테스트: 클라이언트 툴 없이 개발자가 짜 놓은 테스트 코드를 실행시켜서 기대 결과를 확인한다. Controller의 API를 호출하면 서비스 계층과 데이터 액세스 계층을 거쳐 기대 결과를 확인한다. 기능 테스트: 사용자 입장에서 애플리케이션의 기능이 올바르게 동작하는지 테스트한다. 일반적으로 테스트 전문 부서에서 진행하며, API 툴이나 데이터베이스까지 연관되어 있다. 🌳 F.I.R.S.T 원칙 Fast: 테스트 케이스는 빨라야 한다. ※ 테스트 케이스: 테스트를 위한 입력 데이터, 실행 조건, 기대 결과.. 2022. 9. 7.
ApplicationEventPublisher: How to use events in Spring | @Async ApplicationEventPublisher는 ApplicationContext가 상속받는 인터페이스(기능) 중 하나이다. 이벤트란? 회원 가입을 하면 이메일을 전송하는 서비스가 있다고 가정하자. 핵심 로직은 회원 가입 서비스이고, 이메일 전송은 부가적인 이벤트라고 볼 수 있다. 하나의 서비스에 여러 로직이 섞여 있으면 유지보수가 어렵고 코드가 복잡해진다. 이메일 전송 중에 문제가 생긴다면? 여러 로직이 존재할 때 이 모든 로직을 롤백 하는 것은 비효율적이다. Service 클래스에는 회원 가입 로직만 남기고 이메일 전송 로직은 개별 이벤트로 처리할 수 있다! 로직 사이에 이벤트 Publisher 배치 → 이벤트를 던진다! → 리스너가 이를 캐치해서 이벤트 로직 실행 🌿 이벤트 클래스 생성하기 이 클래.. 2022. 9. 5.
트랜잭션 트랜잭션이란 여러 개의 작업들을 하나의 그룹으로 묶어서 처리하는 단위이다. ACID 원칙 원자성(Atomicity): 하나의 그룹 단위는 모두 성공하거나, 모두 실패해야 한다. 일관성(Consistency): 트랜잭션이 성공적으로 종료되면, 비즈니스 로직의 의도대로 일관성 있게 처리돼야 한다. 격리성(Isolation): 여러 개의 트랜잭션이 실행될 때, 서로 영향을 주지 않고 독립적으로 실행되어야 한다. 지속성(Durability): 트랜잭션이 완료되면 DB가 종료되어도 데이터는 물리 저장소에 저장되어 결과가 지속되어야 한다. 커밋과 롤백 커밋: 모든 작업을 최종적으로 DB에 반영한다. 이 명령을 수행하면 하나의 트랜잭션 과정이 종료된다. 롤백: 작업 중 문제가 생겼을 때, 트랜잭션 내 수행된 작업을 .. 2022. 9. 5.