본문 바로가기

dev

REST API URI설계 프로젝트를 진행하며 RESTful API를 설계하게 되었다. 2008년 Leonard Richardson은 Web API에 대한 성숙도 모델을 다음과 같이 제시했다. 수준 0: 한 URI를 정의합니다. 모든 작업은 이 URI에 대한 POST 요청입니다. 수준 1: 개별 리소스에 대한 별도의 URI를 만듭니다. 수준 2: HTTP 메서드를 사용하여 리소스에 대한 작업을 정의합니다. 수준 3: 하이퍼미디어(HATEOAS, 아래에 설명)를 사용합니다. Fielding의 정의에 따르면 수준 3에 이르는 Web API가 진정한 RESTful API에 해당한다. 현재는 아직 공부가 부족해 HATEOAS는 적용하지 못할 것 같다. 수준2 까지 모델을 설계해 본 후, 차후 REST에 대한 이해가 깊어지면 HATEOAS..
Mock vs Stub Test Double 유닛 테스의 테스트 케이스는 테스트 대상이 의존하는 것에 독립적이어야 한다.즉, 테스트 대상을 격리시키는 것이 필요하다. 이를 가능하게 하는 방법은 실제 대상을 모방한 가짜를 사용하면 된다.이렇게 사용되는 대역을 stub/Mock/Fake라고 부른다. 그리고 이들을 묶어 Test Double(테스트 대역)이라고 부른다. Mock vs StubMock Object : 행위 검증(behavior verification)에 사용Stub : 상태 검증(state verification)에 사용Mock Object의 위키피디아의 정의는 다음과 같다.In object-oriented programming, mock objects are simulated objects that mimic the..
spring data jpa 사용자 정의 repository 프로젝트를 하며 spring data jpa를 사용하는데, 직접 메소드를 구현하고 싶었다.DB에 데이터를 입력하기 전에 처리하고 싶은 작업이 있었는데, 쿼리가 복잡할 것 같기 때문이었다.검색해 보니 이 경우 커스텀 레포지토리를 정의하여 사용하면 된다고 한다. 물론 JpaRepository 인터페이스를 통째로 구현하는 방법도 있지만..간단히 JpaRepository가 제공하는 기능을 사용하되, 커스텀 기능을 추가하는 방법을 조사했다. 1. 커스텀 레포지토리 인터페이스를 작성한다.public interface CustomEmpRepository {public List customMethod();} 2. 1에서 작성한 인터페이스를 구현하는 클래스를 작성한다.- 이 클래스의 이름은 default spring d..
Spring boot에서 JPA 테스트하기 @DataJpaTest를 이용해 쉽게 JPA 테스트 환경을 구축할 수 있다. @DataJpaTest는 다음 기능을 제공한다.in-memory db 생성(real db를 사용하고자 할 경우 @AutoConfigureTestDatabase(replace = Replace.NONE))@Entity 클래스 스캔(일반적인 다른 컴포넌트는 스캔하지 않음)@Transactional 어노테이션을 포함 (이 옵션을 끄려면 @Transactional(propagation = Propagation.NOT_SUPPORTED) )TestEntityManager 빈 생성 Spring Boot Test 에 상세한 내용이 있다.한글에다가 잘 정리되어 있어 spring test 관련 내용을 학습하기에 좋다.
Spring boot Rest controller 유닛테스트 tutorials point 에 기본적인 내용은 모두 수록되어 있다. 튜토리얼을 따라하면 정상적으로 테스트가 수행된다. [발생할 수 있는 오류]1. 특정 bean을 찾을 수 없다는 에러(해결책)ex) org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'io.github.yoonho.studytime.service.users.UsersServiceImpl' available
TDD 개념 정리 TDD 개발 원칙Clean code that works오직 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다.중복을 제거한다. 실패하는 테스트 코드를 한 번에 하나 이상 작성하지 않는다. TDD 장점ㆍ개발자의 방향을 잃지 않게 유지: 현재 자신의 개발 내용 및 진척 상황을 항상 살펴볼 수 있다.ㆍ품질 높은 소프트웨어 모듈 보유 : 간결한 코드 유지 가능ㆍ자동화된 단위 테스트 케이스 소유: 개발자가 필요한 시점에 언제든 수행할 수 있으며 시스템의 이상 유무를 바로 확인할 수 있다.ㆍ사용설명서 & 의사 소통의 수단: 작성된 테스트 케이스는 제품 코드 사용 설명서이자 동시에 다른 개발자와 소통하는 커뮤니케이션 통로가 된다. (제품 코드 API 사용 예시가 된다.)ㆍ설계 개선 : 테스트 케이스 작성 시 ..
Advice를 이용한 예외 처리 - IdAlreadyExistExceptionpublic class IdAlreadyExistingException extends RuntimeException { public IdAlreadyExistingException(String userId){ super("user id \""+userId+"\" is already exist"); } } - UserExceptionAdvice@ControllerAdvice public class UsersExceptionAdvice { @ResponseBody @ExceptionHandler(IdAlreadyExistingException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) String idAlreadyExist..
spring data jpa에서 enum 사용 방법 엔티티 클래스 중, Enum 값을 가지는 필드에 @Enumerated 를 붙여준다.@Enumerated에는 EnumType.STRING 혹은 EnumType.ORDINAL을 인자로 전달할 수 있다.둘의 차이는 다음과 같다. @Enumerated(EnumType.STRING) Rating rating the value of rating.name() is written and read from the corresponding database column; e.g. G, PG, PG13 @Enumerated(EnumType.ORDINAL) Rating rating the value of rating.ordinal() is written and read from the corresponding database ..