일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 이펙티브 자바
- Handler Adepter
- mavenCentral
- 컴포넌트스캔
- 생성자 주입
- @Bean
- 싱글 스레드
- 필드 주입
- @Configuration
- 익명 함수
- OSIV
- Spring Batch
- 일괄처리
- 스프링 빈
- spring boot
- @FunctionalInterface
- 빈
- open-in-view
- Open EntityManager In View
- 가변 객체
- Dispatcher Servlet
- @componentScan
- Batch
- 참조 타입
- 메서드 주입
- 불변 객체
- Request flow
- Spring Framework
- View Resolver
- open session in view
- Today
- Total
목록spring (9)
보다 더 나은 내일의 나를 위해
개요 스프링은 클래스 간의 의존성을 풀기 위해 의존성 주입을 사용합니다. 의존성 주입을 할 때 크게 2가지 방법이 있습니다. @Autowired 어노테이션 활용 생성자 주입 위 두 가지 방법 모두 의존성을 성공적으로 주입해 줍니다. 하지만 스프링 4.3부터는 2번째 방법인 생성자 주입 방법을 권장합니다. ⚠︎ field injection is not recommended 그렇다면 이 둘의 차이점과 왜 생성자 주입 방법을 권장하는지 알아봅시다. 생성자 주입 사실 생성자 주입 방법을 사용한다고 해도 @Autowired 어노테이션이 사용됩니다. 만약 @Autowired를 생성자에 붙여주지 않고, 단일 생성자만 존재한다면 어노테이션이 사용되지 않아도 항상 사용됩니다. 또한 생성자가 많다면 가장 많은 필드에 의존..
개요 예전에 했던 프로젝트를 조금 리펙터링 하던 중 인터셉터를 사용할 일이 있었습니다. 그러다 문득 '예전에 인터셉터와 필터가 무엇이 다른지 봤었는데'라는 생각이 났지만, 기억이 나지 않았습니다. 그래서 이 기회에 정리해 보려고 합니다. 실행 시점 우선 필터와 인터셉터는 스프링 플로우 중 실행 시점이 다릅니다. 위 그림에서 알 수 있듯, 필터는 DispatcherServlet보다 먼저 실행됩니다. 따라서 필터는 웹 애플리케이션의 Context 기능이라 Spring의 Context에 접근하기 힘듭니다. 반대로 인터셉터는 Spring Context 안에서 실행됩니다. Controller가 동작하기 전에 실행되죠. 따라서 다른 빈을 사용하는 등 다른 Spring Context에 접근하기 편리합니다. uri 패..
개요 record는 자바 14 버전에서 새로 추가된 클래스의 종류 중 하나입니다. 다음 문서에서 설명하는 record의 목적은 다음과 같습니다. 데이터를 데이터로 모델링하기 - JEP 359 record 클래스의 간단한 특징은 다음과 같이 정리할 수 있습니다. record 클래스는 final 클래스이다. 모든 필드가 private final로 선언된다. 모든 필드에 대해 초기화하는 생성자가 생성된다. 각 필드에 대해 필드 명을 딴 getter가 생성된다. (ex. private final String name -> public String name()) equals(), hashCode(), toString() 함수를 암묵적으로 정의한다. 이런 특징들을 봤을 때, @Service 클래스는 의존성 주입을 ..
개요 빈 클래스에 @Component 어노테이션을 사용하는 것과 @Configuration 클래스에서 @Bean으로 빈 클래스를 등록하는 것 모두 스프링 빈에 클래스를 등록하는 동작을 하는 어노테이션입니다. 그렇다면 @Component와 @Bean의 차이는 무엇일까요? @Component 기본적으로 @Component 어노테이션은 빈 클래스 위에 사용해 빈에 등록하는 기능을 합니다. @Component public class MyClass { ... } 위 코드처럼 작성하게 되면 MyClass 객체가 스프링 빈에 등록됩니다. @Controller와 @Service 등은 @Component를 포함하고 있으므로 따로 명시해 주지 않아도 스프링 빈에 등록됩니다. @Component를 사용하게 되면 @Sprin..
✍️ Spring MVC request flow 스프링 MVC 구조에서는 요청을 받으면 여러 가지 과정을 거쳐 요청을 수행합니다. 오늘은 이 요청에 대한 흐름을 살펴봅시다. 📝 요약 우선 전체적인 흐름은 다음 사진과 같습니다. 그렇다면 이제 차근차근 살펴봅니다. 📲 요청이 들어왔을 때 우선 전면 컨트롤러인 Dispatcher Servlet이 요청을 받습니다. 그 후 Handler Mapping을 통해서 해당 요청을 수행할 수 있는 Controller를 찾습니다. 🔧 요청의 처리 Dispatcher Servlet은 찾아온 Controller를 토대로 Handler Adepter를 통해 요청을 위임합니다. 컨트롤러는 비즈니스 로직을 통해 요청을 처리하고 뷰 이름을 반환합니다. 📄 뷰 랜더링 마지막으로 Dis..
JPA에서는 객체를 DB에서 찾아올 때의 방식을 위한 즉시 로딩과 지연 로딩 옵션 중 하나를 설정해 줄 수 있습니다. @ManyToOne의 기본값은 즉시 로딩이고, @ManyToMany의 기본값은 지연 로딩으로 되어있습니다. 이 두 옵션은 무슨 차이가 있을까요? 즉시 로딩 : 즉시 로딩은 DB에서 엔티티를 찾아올 때 연관관계를 맺고 있는 엔티티들을 한 번에 바로 조회합니다. 지연 로딩 : 지연 로딩은 DB에서 엔티티를 찾아올 때 연관관계를 맺고 있는 엔티티들은 프록시 객체를 할당해 주어 나중에 실제로 사용할 때 따로 조회를 시도합니다. 코드를 통해 한번 알아봅시다. 우선 사용할 엔티티 구조입니다. Human과 Organism은 서로 1 : N 관계입니다. 이때 fetch의 기본 값은 즉시 로딩(EAGER..
OSIV Open In View는 Open Session In View라 불리며 관례상 OSIV라 부릅니다. OSIV는 영속성 컨텍스트를 트랜잭션이 종료되어도 VIew 렌더링 또는 응답 시까지 살아있도록 합니다. Spring Boot에서는 spring.jpa.open-in-view의 기본값이 true로 되어있습니다. 이 값이 true 일 때와 false 일 때 무엇이 다를까요? True라면? spring.jpa.open-in-view의 값이 기본값인 true라면 트랜잭션이 종료되어도 영속성 컨텍스트가 살아있다. 예를 들어 Book와 Bookcase라는 엔티티가 있습니다. // 책 @Entity public class Book { ... @ManyToOne(fetch = FetchType.LAZY) @Jo..
이 포스트는 공식 문서를 참고하여 작성되었습니다. 예제 코드는 깃허브에 작성되어 있습니다. Person package com.example.batch.model; public class Person { private String lastName; private String firstName; // Constructor, getter, setter, toString... } 읽어온 데이터로 구성될 객체입니다. BatchConfiguration package com.example.batch.config; // ... public class BatchConfiguration { // ... @Bean public FlatFileItemReader reader() { return new FlatFileItem..
스프링 배치 (Spring Batch) 일괄 처리를 위한 오픈소스 프레임 워크 여러 Job을 순차적으로 처리한다. 보통 어떤 경우에 사용할까? 대용량 비지니스 데이터를 복잡한 작업으로 처리해야하는 경우 특정한 시점에스케쥴러를 통해 자동화된 작업이 필요한 경우 ( ex. 푸시알림, 월 별 리포트) 대용량 데이터 포멧을 변경, 유효성 검사 등의 작업을 트랜젝션 안에서 처리 후 기록해야하는 경우 스프링 배치 시나리오 읽기 → 데이터 저장소(데이터베이스, 파일 등)에서 데이터를 읽어온다. 처리 → 데이터를 원하는 대로 가공 / 처리 한다. 쓰기 → 처리 완료된 데이터를 저장한다. 스프링 배치 관계도 Job과 Step은 1:M의 연관 관계를 맺고 있다. Step와 ItemReader, ItemProcessor,..