애정코딩 💻

Interceptor 활용하기 ( feat . ArgumentResolver, Custom Annotation )

동기분의 도움으로 처음으로 Interceptor 를 적용해보아서 나중에 사용할 일이 있을 때 찾아보려고 써봅니다! 아래와 같은 Controller 에 Header 에서 인증을 위한 값을 받아야지만 접근할 수 있도록 설정하겠습니다! @RestController @RequestMapping("/orders") @RequiredArgsConstructor public class OrdersController { private final OrdersService ordersService; @Auth(type = ApiServiceType.HOMEPAGE) @GetMapping public ResponseEntity getOrders( @RequestParam(required = false) String sear..

WEB/Spring 2022.03.25 Joana

Test-Driven-Development 테스트 주도 개발

TDD 개발 방식 TDD 는 테스트 코드를 작성한 뒤에 실제 코드를 작성하는 것이다. 테스트가 통과된 코드만을 실제 코드로 작성한다 -> 버그가 줄고 소스가 간결해지며 설계가 개선된다. - 설계 단계에서 프로그래밍 목적을 미리 정의한다. - 무엇을 테스트해야 할지 미리 정의한다. - 테스트 코드 작성 도중 발생하는 예외 사항을 테스트 케이스에 추가한다. (설계 개선) TDD 프로세스 실패하는 작은 단위 테스트 추가 -> 테스트 통과, 최소한의 코딩 -> 구현 설계 개선, 중복 제거, 리팩토링 , 테스트 통과 유지 좋은 테스트의 특징 Fast: 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다. Independent: 각각의 테스트는 독립적이며 서로 의존해서는 안된다. Repeatable: 어느 환경에서..

WEB/JAVA 2022.03.24 Joana

Java 8 Interface - default 메서드, static 메서드

Java 8 이후로 interface에 대한 정의가 몇가지 변경되었다. 상황 이미 만들어져 있는 Interface 에 기능을 추가 하고 싶다. 하지만 이 Interface를 implemnets 받고 있는 class 모두가 이 기능의 구현체를 생성해야만 한다. default 메서드 인터페이스가 default 키워드로 선언되면 메서드를 구현할 수 있게 된다. -> 구현체들은 오버라이딩이 가능하다. package com.example.demo; public interface UserService { String getName(Long userId); int getAge(Long userId); /** * @implSpec 이 구현체는 주소를 반환한다. * @param userId * @return */ // ..

WEB/JAVA 2022.03.23 Joana

[MapStruct] 내가 찾아 쓰려고 정리한 글

🏃‍♂️ 계속해서 업데이트 하기 🏃‍♂️ 1. 공식문서 2. 왜 사용할까? 3. 동작방식 4. 의존성 5. Mapper Inteface 작성 6. Mapper 구현체 살펴보기 공식문서 https://mapstruct.org/documentation/stable/reference/pdf/mapstruct-reference-guide.pdf MapStruct 왜 사용할까? 보통 DB에서 데이터를 조회하고 서비스단에서 로직을 설계 하기 위해 Entity -> Dto , Dto -> Entity 작업을 하게 되는데 이러한 Mapping 작업을 해주는 라이브러리가 많이 존재한다 그중 아래의 링크를 확인해보면 MapStruct 퍼포먼스가 빠른 것을 확인할 수 있다. https://www.baeldung.com/j..

WEB/JAVA 2022.03.16 Joana

[Querydsl] 내가 찾아 쓰려고 정리한 글

🏃‍♂️ 계속해서 업데이트 하기 🏃‍♂️ 마지막 업데이트 2022/03/29 1. Querydsl 을 왜 사용할까? 2. 작동방식? 3. 의존성 4. Repository 구조 5. Projection 의 대한 고찰 ... 6. 동적쿼리 (BooleanBuilder) 7. ExpressionUtils 8. 정렬 타입에 따른 정렬 처리 Querydsl 을 왜 사용할까? JPA 를 사용하면서 (@Query 포함) 조회 기능에 대한 한계가 있다. 동적인 쿼리인 경우인데 예를 들어 주문 페이지를 검색 한다고 했을 때 카테고리 or 상품명 or 기업명 등등... 으로 검색 조건이 달라지는 부분이다. 그래서 사용하게 된 것이 바로 Querydsl 프레임워크 이다. - 타입 체크가 바로 가능하다 - 자바 코드를 기반으..

WEB/JPA 2022.03.15 Joana

[Lombok] Difference Between @Value and @Data

컴파일과정에서 생성해 주는 방식으로 동작하는 java라이브러리입니다. @Value 기본적으로 불변객체로 만들어준다. class에 선언하면 아래의 어노테이션이 기본적으로 포함된다. @Getter @AllArgsConstructor @ToString @EqualsAndHashCode @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) 하지만 @Setter 는 포함되지 않는다. 왜냐하면 기본적으로 불변성을 보장하기 때문에 setter를 생략하는 것은 당연하다 @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) 는 private이나 final 을 사용할 수 있게 해준다. 최종적으로 @Value ..

WEB/JAVA 2022.03.11 Joana