오늘의 기록
![[Spring] Service - 인터페이스 도입과 버저닝](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclYdnE%2FbtslB2wG4Uu%2FRhQEgHRf6BzpzmDItxFKoK%2Fimg.png)
[Spring] Service - 인터페이스 도입과 버저닝
예전에 프로젝트를 하다 보면 Controller가 Service 구체 클래스를 의존하는 방식을 많이 사용했었는데, 이러한 설계 방식은 Controller가 Service 클래스 단 하나만 의존하기 때문에 다형성이 부족하다. 따라서 객체 지향 설계(DIP)와 향후 다음 버전에 대한 확장성을 위해 Service 계층에 인터페이스를 도입했다. 기존 설계 방식 @RestController @RequiredArgsConstructor public class Controller { private final Service service; // 클래스 직접 주입 } @Service @RequiredArgsConstructor public class Service { private final Repository repo..
[Spring] 의존성 역정 원리(DIP) 관련 용어
예전에 어떤 시니어 분이 공유해준 글(참고자료)을 나에게 맞게 쉽게 정리해봤다. 평소 겉으로 알고 있던 개념이지만, 이번 기회에 조금 더 명확히 이해할 수 있었다. IoC(Inversion of Control, 제어 역전) 전통적인 방식에 반대되는 흐름으로 코드가 진행되는 것을 말하는 일반적인 용어이다. IoC를 설명하는 단골 예시는 바로 라이브러리와 프레임워크이다. 라이브러리는 내 코드가 라이브러리 코드(외부 코드)를 호출하지만, 프레임워크는 프레임워크(외부 코드)가 내 코드를 호출한다. → IoC는 프레임워크의 일반적인 특성이다. Dependency Inversion Principle(DIP, 의존성 역전 원리) 의존관계를 갖는 인스턴스의 구성이 추상화에 의존하는 것을 뜻한다. 다음과 같이 인스턴스 ..
[Spring] @TransactionalEventListener에서 예외가 발생하지 않는 이슈
문제 @TransactionalEventListener에서 예외가 발생하지 않는 이슈 이게 무슨말인가 하면, @TransactionalEventListener에서 예외 발생 시, 예외를 찍어주지 않는다. 처음엔 예외 자체가 발생하지 않았다고 생각했는데, 로그를 debug로 찍어보면 잘 나온다. 즉, 예외는 발생했지만 해당 예외가 error가 아닌 debug로 찍힌다는 것. 원인 콜스택을 분석해봤다. @Transactional이 붙은 메서드를 본 메서드, @TransactionalEventListener를 이벤트 메서드라고 했을 때, 이벤트 메서드는 본 메서드의 트랜잭션이 커밋된 이후, 실행하는 메서드다. 이 때 이벤트 메서드는 실행 후 종료 직전 TransactionSynchronization.after..
[Spring] 스프링 디렉터리 패키지 구조
계층형 디렉터리 구조 com ㄴ example ㄴ nuribank ㄴ config ㄴ controller ㄴ domain ㄴ repository ㄴ service ㄴ security ㄴ exception 스프링 각 웹 계층들을 대표하는 클래스, 디렉터리들을 기반으로 패키징한다. 스프링 웹 계층 Web Layer: 사용자의 요청과 이에 대한 응답 반환의 전반적인 처리가 일어나는 영역 Service Layer: Web Layer와 Repository Layer 사이에서 실질적인 애플리케이션 비즈니스 로직이 일어나는 영역 Repository Layer: DB에 접근 및 통신하는 영역 장점 전체적인 구조를 빠르게 파악할 수 있다. 단점 각 패키지에 클래스들이 너무 많이 모이게 된다. 하나의 패키지 안에 서로 의..
[Spring] Spring Data JPA의 페이징
인자 타입 - Pageable findAll()과 같이 컬렉션 조회를 하게 되면 페이징이 필요할 때가 있다. 페이징을 위해서는 기본적으로 몇 번째 페이지인지에 대한 정보와(page) 한 페이지당 보여줄 데이터의 개수가(size) 필요하다. Spring Data JPA는 이러한 정보를 위해 Pageable 인터페이스를 사용한다. @GetMapping public ResponseEntity page(@RequestParam int page, @RequestParam int size) { Pageable pageable = PageRequest.of(page, size); Page members = memberRepository.findAll(pageable); return new ResponseEntity(..
[Spring] @ControllerAdvice, 특정 예외 발생 시 404에러가 발생하는 이슈
문제 서버에서 IllegalArgumentException 등의 여러 예외는 미리 설정한 @ControllerAdvice를 지나게 되는데, 분명 ExceptionHandler에서 특정 예외에 대해 400, 403 에러 등의 status code를 지정했지만 전부 404 에러로 바뀌어서 리턴된다. @ControllerAdvice class CherryAdminGlobalExceptionHandler { @ResponseStatus(HttpStatus.BAD_REQUEST) // -> 400코드 @ExceptionHandler(IllegalArgumentException::class) fun handle(ex: IllegalArgumentException): Response { log.error("{}", ..
[Kotlin] 추가적으로 알아두어야 할 코틀린 특성
자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) 자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) - 인프런 | 강의 이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다., - 강의 소개 | 인프런 www.inflearn.com 강의를 들으며 내용 정리 코틀린의 이모저모 Type Alias와 as import 긴 이름의 클래스 혹은 함수 타입이 있을 때, 축약하거나 더 좋은 이름을 쓰고 싶다면? fun filterFruits(fruits: List, filter: (Fruit) -> Boolean) { // (Fruit) ->..
![[Kotlin] 코틀린에서의 FP](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekLKQO%2FbtsiuNiudJ8%2F4XynHkW3VqIDPLj0TKKjok%2Fimg.png)
[Kotlin] 코틀린에서의 FP
자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) 자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) - 인프런 | 강의 이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다., - 강의 소개 | 인프런 www.inflearn.com 강의를 들으며 내용 정리 코틀린에서 배열과 컬렉션을 다루는 방법 배열 사실 배열은 잘 사용하지 않는다. 이펙티브 자바에서도 리스트를 사용할 것을 권장한다. 그래도 간략한 문법은 알아두자. int[] array = {100, 200}; for (int i = 0; i < array.length; i++)..