본문 바로가기

Spring Basic

(11)
[Spring Basic] 웹 스코프와 프록시 - request 스코프 웹 스코프의 특징웹 환경에서만 동작한다.프로토타입 스코프와 다르게 스프링이 해당 스코프의 종료 시점까지 관리한다. 따라서 종료 메서드가 호출된다. 웹 스코프 종류request : HTTP 요청 하나가 들어오고 나갈 때까지 유지되는 스코프, 각각의 요청마다 별도의 빈 인스턴스가 생성되고 관리된다.session : HTTP Session과 동일한 생명주기를 가지는 스코프application : 서블릿 컨텍스트(ServletContext)와 동일한 생명주기를 가지는 스코프websocket : 웹 소켓과 동일한 생명주기를 가지는 스코프 request 스코프를 예제로 알아보자. 나머지도 범위만 다르지 동작 방식은 비슷하다. 서버에 동시에 여러 HTTP 요청이 오면 해당 로그가 정확히 어떤 요청이 남긴 로그인지 구..
[Spring Basic] 빈 스코프 - 싱글톤 vs 프로토타입 스코프는 빈이 존재할 수 있는 범위를 뜻한다.예를 들어 싱글톤은 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때까지 유지되는 스코프다. 스프링은 다음과 같이 다양한 스코프를 지원한다.singleton : 기본 스코프, 스프링 컨테이너의 시작부터 종료까지 유지되는 가장 넓은 범위의 스코프prototype : 스프링 컨테이너는 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프request : 웹 요청이 들어오고 나갈 때까지 유지되는 스코프session : 웹 세션이 생성되고 종료될 때까지 유지되는 스코프이다.application : 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프이다. 빈 스코프는 다음과 같이 지정할 수 있다.// 자동 등록@Sco..
[Spring Basic] 빈 생명주기 콜백 데이터베이스 커넥션 풀이나 네트워크 소켓과 같이 애플리케이션 시작 시점에 필요한 연결을 미리 설정하고, 애플리케이션 종료 시점에 해당 연결을 모두 해제하는 작업을 진행하려면 객체의 초기화 작업과 종료 작업이 필요하다. 스프링은 초기화 작업과 종료 작업을 어떻게 진행하는지 알아보자. 간단하게 외부 네트워크에 미리 연결하는 객체를 생성한다고 가정해보자. 이 객체는 애플리케이션 시작 시점에 connect() 메서드를 호출해서 연결을 맺어두어야 하고, 애플리케이션이 종료되면 disconnect() 메서드를 호출해서 연결을 끊어야 한다.public class NetworkClient { private String url; public NetworkClient() { System.out.pr..
[Spring Basic] 의존관계 자동 주입 의존관계 주입은 크게 4가지 방법이 있다.생성자 주입수정자(setter) 주입필드 주입일반 메서드 주입당연한 이야기지만, 의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다.  1. 생성자 주입 (권장)생성자를 통해서 의존관계를 주입하는 방식이다.딱 1번만 호출되는 것이 보장된다. (생성자 호출 시점에 딱 1번만 호출되고 더는 호출되지 않는다.)불변, 필수 의존관계에 사용한다.@Componentpublic class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Auto..
[Spring Basic] 컴포넌트 스캔 지금까지는 AppConfig(설정 정보 클래스)에 @Bean을 통해 직접 등록할 스프링 빈을 나열했다.그런데 등록할 스프링 빈이 많아지면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 그래서 스프링은 설정 정보가 없어도, 자동으로 스프링 빈을 등록하는 "@ComponentScan" 기능을 제공한다.또한 의존관계도 자동으로 주입하는 "@Autowired" 기능도 제공한다.   컴포넌트 스캔을 사용하려면 @ComponentScan 애노테이션을 설정 정보 클래스(AppConfig)에 붙여주면 된다.@Configuration@ComponentScanpublic class AppConfig {} 컴포넌트 스캔은 말 그대로 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 ..
[Spring Basic] @Configuration이 싱글톤을 보장하는 방법 - 바이트코드 조작 다음 AppConfig 코드를 보자.@Configurationpublic class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(..
[Spring Basic] 싱글톤과 싱글톤 방식의 주의점 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 보낸다. 예전에 만들었던 스프링 없는 AppConfig는 요청을 할 때마다 객체를 새로 생성한다. 고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸된다는 뜻이다. 즉, 메모리 낭비가 심하다. 다음 테스트 코드를 통해 첫 번째 요청에서 받은 객체와 두 번째 요청에서 받은 객체가 서로 다르다는 것을 알 수 있다.@Testvoid pureContainer() { // given AppConfig appConfig = new AppConfig(); // when MemberService memberService1 = appConfig.memberService(); MemberService memberServ..
[Spring Basic] 스프링 컨테이너와 스프링 빈 스프링 컨테이너의 생성 과정저번 글에서는 순수한 자바만으로 DI를 적용했다. 이제 AppConfig를 스프링 기반으로 변경해 보자.@Configurationpublic class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); }} AppConfig에 설정을 구성한다는 뜻의 @Configuration을 붙여주고, 각 메서드에 @Bean을 붙여준다. 실..
[Spring Basic] 스프링은 어떻게 OCP, DIP를 지킬까? - DI(의존관계 주입) 결론부터 말하자면, 스프링은 다음 기술로 다형성과 OCP, DIP를 가능하게 해 준다.DI(Dependency Injection): 의존관계 주입DI 컨테이너: 자바 객체들의 의존관계 연결, 주입이 기술들을 통해 클라이언트 코드의 변경 없이 기능을 확장할 수 있는 것이다. 옛날 어떤 개발자가 좋은 객체지향 프로그래밍을 하려고 OCP, DIP를 지키면서 개발해 보니, 배보다 배꼽이 큰 상황인 것이다. 그래서 이를 프레임워크로 만들어버렸고, 그것이 지금의 스프링이 되었다. 순수하게 자바로 OCP, DIP를 지키면서 개발해 보면 결국 스프링 프레임워크를 만들게 된다. (정확히는 DI 컨테이너) 이제부터 이것이 어떻게 만들어졌는지 코드로 이해해 보자.어떤 회원 서비스에 회원 저장소로 메모리 회원 저장소와 JDB..
[Spring Basic] 좋은 객체지향 설계 5가지 원칙 - SOLID 좋은 객체지향 설계 5가지 원칙 SOLID는 각각 다음을 뜻한다.S - SRP - 단일 책임 원칙 - Single Responsibility PrincipleO - OCP - 개방 폐쇄 원칙 - Open Closed PrincipleL - LSP - 리스코프 치환 원칙 - Liskov Substitution PrincipleI - ISP - 인터페이스 분리 원칙 - Interface Segregation PrincipleD - DIP - 의존관계 역전 원칙 - Dependency Inversion Principle  SRP - 단일 책임 원칙한 클래스는 '하나의 책임'만 가져야 한다.여기서 하나의 책임이라는 것이 조금 모호하다. 클 수도 있고 작을 수도 있으며, 문맥과 상황에 따라 다를 수도 있다. 여기..
[Spring Basic] 스프링의 핵심과 다형성 스프링이 뭘까? 왜 만들었을까? 핵심은 뭐지?스프링은 스프링 프레임워크와 스프링 부트를 모두 포함한 스프링 생태계를 뜻한다. 좁게 말하자면 스프링 DI 컨테이너 기술이다.아무리 복잡한 기술이라도 그 기술의 핵심은 단순하다. 그 핵심을 모르고 사용한다면 그저 단순하게 사용법만 알고 있는 것이다. 그러면 스프링의 핵심은 뭘까? 웹 애플리케이션 편하게 개발하게 해주고, DB 접근 편하게 해주는 기술일까? 맞는 말이지만 핵심은 아니다. 스프링의 진짜 핵심은 스프링이 자바 기반의 프레임워크라는 것을 보면 알 수 있다. 자바 언어의 가장 큰 특징은 객체지향 언어라는 것이다. 즉, 스프링은 "좋은 객체지향 애플리케이션"을 개발할 수 있도록 도와주는 프레임워크다. 스프링 이전의 개발자들은 EJB라는 기술에 종속적으로 ..