Spring

    [SpringMVC] 타임리프 - 기본기능

    [SpringMVC] 타임리프 - 기본기능

    스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의 웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원 www.inflearn.com 강의를 들으며 생각 정리 프로젝트 생성 스프링 부트 스타터(https://start.spring.io/) 에서 프로젝트를 생성한다. 간단하게 테스트(애플리케이션 실행 등) 해서 정상 작동하는지 확인한다. +) 롬복의 경우 다음 링크를 참고해서 설치한다. gksdudrb922.tistory.com/65 스프링 - 롬복(lombok) 라이브러리 설치 롬복 라이브러리는 ..

    [Spring] DTO의 사용 범위

    DTO DTO(Data Transfer Object)란 계층간 데이터 교환을 위해 사용하는 객체다. MVC 패턴에서 컨트롤러가 뷰와 모델의 데이터를 주고 받을 때 보통 DTO를 사용한다. 도메인 객체(모델)을 뷰에 직접 전달할 수도 있지만, 뷰에 불필요한 민감한 도메인의 정보가 노출될 수도 있고, 도메인이 뷰에 의존하게 되는 경우도 있다. DTO의 범위 모델과 뷰 사이에 DTO를 사용한다는 것은 알겠는데, 일반적으로 사용하는 레이어드 아키텍처 (Controller - Service - Repository)에서 DTO는 어떻게 다뤄야 할까? 조금 더 간단하게 말하자면, 결국 뷰와 같은 화면과, 비즈니스 로직의 데이터 교환은 DTO를 통해 이루어지는데, 도메인 → DTO, DTO → 도메인을 변환하는 작업은..

    [Spring] Service - 인터페이스 도입과 버저닝

    [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("{}", ..