Spring
-
Service Layer의 단위테스트 작성 : (1) Mockito ①Spring 2022. 1. 28. 09:40
서비스 계층을 테스트 하기 위해서 실제 Repository를 DI하게 된다면 단위테스트를 작성하기 위한 F.I.R.S.T원칙을 위배하게 된다. Fast : @SpringBootTest 어노테이션이 해당 어플리케이션이 모든 빈을 Ioc 컨테이너에 등록하고 테스트를 진행하므로 테스트가 느려진다. Independent : repository와 의존관계를 갖는 테스트 를 작성하게 된다면 테스트 대상이 Service계층의 테스트는 Repository에 의존적이 되므로 독립적인 테스트작성이 어려워 진다. Repeatable : DB에 의존적인 테스트는 한번 ID가 생기면 중복되므로 반복 테스트가 어렵다. 테스트 어노테이션 @SpringBootTest 통합테스트, 전체 Bean전체 @WebMvcTest 단위테스트, ..
-
예외처리전략 ( ExceptionHandler ) 2Spring 2022. 1. 13. 18:17
https://dodop-blog.tistory.com/229 예외처리전략 (Exception Handler) 스프링에서 예외처리를 해주자. 예외발생 데이터타입을 일관된 형태로 생성해서 반응하도록 설정해준다. Error Response 먼저 예외의 형태를 잡아주는 클래스를 작성해준다. 메세지와 상태, 시간정 dodop-blog.tistory.com 이전 글에서 예외처리 전략을 이용하여 예외발생 데이터타입을 일관된 형태로 생성해서 반응하도록 설정하는 방법을 알았다. 그런데 여기서 모든 customException을 RuntimeException을 상속받아 중복되는 NotFoundException의 경우에도 모두 ControllerAdvice(GlobalExceptionHandler)에서 일일이 처리해주어야..
-
JPA 엔티티에 생성 시점, 수정 시점 Timestamp 추가하기 ( + Auditing)Spring 2022. 1. 13. 09:19
프로젝트 엔티티를 구성할 때 엔티티에 중복으로 created_at, updated_at 등의 생성 시간, 업데이트 시간을 column으로 중복적으로 필요해질 때가 있다. 이럴 때 JPA Auditing을 사용해서 시점 생성을 자동화 할 수 있다. BaseTImeEntity 생성 @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class BaseTimeEntity { @CreatedDate @Column(nullable = false) private LocalDateTime createdAt; @LastModifiedDate private LocalDateTime updatedAt; public LocalDat..
-
JPA getById() 와 findById()의 차이Spring 2022. 1. 12. 22:33
jpa에서 ID를 이용하여 객체를 가져오는 방법에는 getById(), findById() 두가지 방법이 존재한다. getById() public void get_activity_with_id(Integer id) { //given //when Activity activity = repo.getById(id); //then } getById()는 원래 메소드인 getOne()이 deprecated되어 대체된 메소드로 내부적으로 EntityManager.getReference() 메소드를 호출하여 엔티티가 아닌 프록시를 반환한다. 이 때문에 실제로 사용하기 전에는 데이터 베이스에 접근하지 않고 실제로 사용될 때 프록시에서 데이터 베이스에 접근하려고 할때 데이터가 존재하지 않는다면 EntityNotFound..
-
테스트 코드 작성할 때 Junit5 사용시 JUnit Vintage 오류 발생Spring 2022. 1. 11. 11:40
테스트 코드를 작성하던 중 다음과 같은 오류를 맞닥뜨리게 되었다. 테스트 메소드를 읽지 못하는 메세지였다. Junit5 import org.junit.jupiter.api.Test; class Junit5Test { @Test void test() { //... } } 단일 jar였던 Junit4와는 다르게 Junit5는 Junit Platform, Junit Jupiter, Junit Vintage 세가지로 이루어져있다. Junit Platform : JVM에서 동작하는 테스트 프레임워크 (TestEngine 인터페이스 정의) Junit Jupiter : Junit5 기반의 테스트 실행 (TestEngine의 실제 구현체) Junit Vintage : Junit3 및 Junit4 기반의 테스트 실행 (..
-
Lombok 사용시 주의할 점Spring 2021. 12. 29. 09:36
스프링 프로젝트를 진행하면 lombok 라이브러리의 편리함 때문에 이를 사용하는 경우가 많지만, 롬복을 사용시에는 다음과 같은 주의점이 존재한다. @AllArgsConstructor, @RequiredArgsConstructor 의 사용 금지 @AllArgsConstructor public static class Card { // private Card(long frontNumber, long backNumber) { // this.frontNumber = frontNumber; // this.backNumber = backNumber; // } private long frontNumber; private long backNumber; } @AllArgsConstructor public static cl..
-
RESTful APISpring 2021. 12. 19. 15:41
API는 Application Programming INterface로 컴퓨터 프로그램간 서로 정보 교환이 가능하도록 하는 것으로 REST API는 REST기반으로 서비스 API를 구현한 것이다. RESTful API RESTful API란 REpresentational State Transfer로 자원에 대한 행위 를 HTTP Method(GET, POST, PUT, DELETE)로 표현하고 자원을 URI로 표현하는 REST아키텍쳐를 스타일 을 따르면서 구현된 시스템을 말한다. 이해하기 쉽고 사용하기 쉬운 API를 만드는 것이 목적이다. REST의 속성 REST는 자원 기반 구조(Resource Oriented Architecture)의 4가지 속성을 따른다. Addressability : 제공하는 모..
-
트랜잭션 (feat. @Transactional)Spring 2021. 12. 18. 18:18
트랜잭션이란 비지니스 로직에서 쪼개질 수 없는 하나 단위의 작업을 말한다. (DB상태 변화를 위해 행하는 작업의 작은 단위) ACID원칙 트랜잭션에는 네가지 원칙이 있다. 원자성 (Atomicity) : 트랜잭션은 하나의 단위로 이루어져야 한다. (모두 성공시 실행, 하나라도 실패시 rollback처리) 일관성 (Consistency) : 트랜잭션 성공시 DB의 데이터는 일관성(같은 결과)을 지녀야 한다. 격리성 (Isolation) : 트랜잭션 처리 과정 중 외부의 간섭은 없어야 한다. (독립적 실행) 영속성 (Durability) : 트랜잭션이 성공하면 그 결과는 영속적으로 보관 되어야 한다. (영구 반영) 트랜잭션 관리 (범위) 트랜잭션의 경계는 프레젠테이션층과 비지니스 로직 층 사이에 존재하는 것..