[Spring AOP] 프록시 패턴과 데코레이터 패턴
·
Spring/AOP
프록시 패턴과 데코레이터 패턴예제 프로젝트 생성v1 - 인터페이스와 구현 클래스 - 스프링 빈으로 수동 등록v2 - 인터페이스 없는 구체 클래스 - 스프링 빈으로 수동 등록v3 - 컴포넌트 스캔으로 스프링 빈 자동 등록실무에서 세 가지 경우를 모두 만날 수 있으므로, 세 가지 빈 등록 방식에 따른 프록시 패턴, 데코레이터 패턴의 적용에 대해 알아본다.예제의 기능은 이전 챕터에서의 상품 주문과 동일하다.예제 프로젝트 만들기 v1OrderControllerV1@RestControllerpublic interface OrderControllerV1 { @GetMapping("/v1/request") String request(@RequestParam("itemId") String itemId); ..
[Spring AOP] 템플릿 메서드 패턴과 콜백 패턴
·
Spring/AOP
템플릿 메서드 패턴과 콜백 패턴#Spring/고급템플릿 메서드 패턴 - 도입 배경이전 챕터에서는, 로그 추적기를 사용하기 위해 메서드 시그니처를 변경하는 것의 문제를 ThreadLocal을 통해 해결하였다.그런데 로그 추적기를 막상 프로젝트에 도입하려고 하니 문제점이 보인다.1~2줄짜리 비즈니스 로직이, 로그 추적기라는 부가 기능 때문에 코드가 엄청 늘어났다.//OrderControllerV0 코드@GetMapping("/v0/request")public String request(String itemId) { orderService.orderItem(itemId); return "ok";}//OrderControllerV3 코드@GetMapping("/v3/request")public Str..
[Spring AOP] 쓰레드 로컬 - Thread Local
·
Spring/AOP
쓰레드 로컬 - Thread Local#Spring/고급예제 프로젝트 만들기 - V0일반적인 웹 애플리케이션에서 Controller → Service → Repository로 이어지는 흐름을 최대한 단순하게 구현@Repository@RequiredArgsConstructorpublic class OrderRepositoryV0 { public void save(String itemId) { //저장 로직 if (itemId.equals("ex")) { throw new IllegalStateException("예외 발생!"); } sleep(1000); } private void sleep(int millis) { ..
[Spring] Spring Initializr에서 AOP가 없는 이유
·
Spring
세 줄 요약Spring Initializr(start.spring.io) 화면에는 ‘Spring AOP’(spring-boot-starter-aop) 항목이 기본으로 표시되지 않는다.2015년부터 “불필요하게 AOP 스타터를 고르는 사용자가 많다”는 이유로 의도적으로 숨긴 정책이 지금까지 이어지고 있다.프로젝트를 만든 뒤 빌드 파일에 spring-boot-starter-aop를 직접 추가하거나, Initializr 검색창에 전체 좌표(org.springframework.boot:spring-boot-starter-aop)를 입력하면 된다.1. 화면에서 빠진 이유배경설명AOP 스타터가 실제 필요 없는 경우에도 많이 선택됐다는 통계가 나왔다‘@Transactional’, ‘@Async’ 같은 기능은 다른 스..
[Spring] @MockitoBean 등장(Spring 6.2), Deprecated되는 @MockBean(Spring Boot 3.4.0)
·
Spring
@MockBean은 스프링부트 3.4.0부터 Deprecated(코드가 어두워 보이지 않는다면, 우측 하단의 다크모드 버튼을 통해 다크모드를 해제하시면 됩니다!)기존 테스트 코드들은, 테스트 코드가 스프링 컨테이너의 의존도가 높았다.이를 개선하고자 Spring Framework 6.2부터 Bean-Override 기능을 테스트 코드에서 활성화한다고 한다.(물론, Bean-Override 기능은, 프로덕션 코드에서는 지양해야 하고, 어차피 프로덕션에서는 Deprecated 될 기능이다. 즉, Bean-Override 기능이 프로덕션 컨텍스트에서는 없어지고 테스트 컨텍스트에서만 유지되도록 모델이 변경되는 것이다) 기본적이 원리는 Bean-Override를 통해, Bean을 테스트용 Bean으로 교체하는 것이..
[Spring Transaction] 트랜잭션 이해와 적용
·
Spring/Transaction
트랜잭션 이해와 적용트랜잭션 - 개념 이해파일이 아닌 데이터베이스에 데이터를 저장하는 이유 트랜잭션하나의 거래를 안전하게 처리하도록 보장커밋(Commit): 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것롤백(Rollback): 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것트랜잭션 ACID트랜잭션은 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장해야 함원자성: 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다.일관성: 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.격리성: 동시에 실행..
[Spring] Spring에서 Bean Validation이 동작하는 내부 원리
·
Spring
Spring에서 Bean Validation이 동작하는 내부 원리#Spring/MVC엔티티 클래스에 Bean Validation 애노테이션 사용엔티티 클래스의 필드에 @NotNull, @Size, @Min, @Max 등과 같은 애노테이션을 붙이면, 해당 필드에 대한 제약 조건이 정의된다.public class User { @NotNull(message = "이메일은 필수입니다.") @Email(message = "올바른 이메일 형식이 아닙니다.") private String email; @Size(min = 2, max = 20, message = "이름은 2자 이상 20자 이하여야 합니다.") private String name; // Getter, Setter ..
[Spring MVC] 스프링 MVC Redirect 처리 방법
·
Spring/MVC
스프링 MVC Redirect 처리 방법#Spring/MVC/Redirect/Redirect 처리 방법/1. HttpServletResponse의 sendRedirect()/2. ResponseEntity/3. RedirectView 직접 반환/4. “redirect:” 접두사/RedirectAttributes/1. Flash Attribute/2. Query Parameter 전달RedirectRedirect 는 클라이언트의 요청을 완전히 새로운 URL로 전달하여 처리하는 방식이다.웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동한다.Redirect 처리 방법1. HttpServletResponse의 sendRedirect()@PostMapping("..
[Spring MVC] 스프링 MVC 기본 기능 정리
·
Spring/MVC
스프링 MVC 기본 기능 정리#Abstract/SpringMVC스프링 MVC 구조와 동작원리, 스프링 MVC가 제공하는 기능의 기본적인 사용법을 정리했습니다./스프링 MVC 구조/ArgumentResolver와 HTTP 메시지 컨버터/ArgumentResolver/HTTP 메시지 컨버터/스프링 MVC 확장/컨트롤러 등록/컨트롤러 등록 - Controller 인터페이스 구현(거의 안씀)/컨트롤러 등록 - HttpRequestHandler 인터페이스 구현(거의 안씀)/컨트롤러 등록 - @Controller, @RestController + @RequestMapping, @XXXMapping/HTTP 조회 방식/HTTP 요청 파라미터 조회/HTTP 요청 파라미터 조회 - 스프링 MVC/1. HttpServle..
[Spring MVC] 타임리프 문법 정리
·
Spring/MVC
타임리프 몰아서 정리#Spring/Thymeleaf/타임리프 사용 선언/th:xxx=“value2”/타임리프 속성/th:href/th:onclick/반복 출력 - th:each/반복 상태 유지/내용 변경 - th:text/속성 변경 - th:value/속성 변경 - th:action/조건문 평가 - th:if, th:switch/텍스트 - text, utext/Escape/HTML 엔티티/Unescape/th:inline="none"/속성 값 설정/속성 추가/checked 처리">/블록 - /URL 링크 표현식 - @{...}/리터럴 대체 - |...|/변수 표현식 - ${...}/지역 변수 선언 - th:with/URL 링크 표현식2 - @{...}/URL 링크 간단히/타임리프 기본 객체/유틸리티 객체..