본문 바로가기

분류 전체보기142

[Spring] 싱글톤 패턴, 스프링 컨테이너, @Configuration 0. 개요 이번 게시물에서는 싱글톤, 스프링 컨테이너, @Configuration의 효과에 대해 작성할 것이다. 해당 게시물을 보기 전, 아래 링크의 글을 보고 오는 것을 추천한다. (스프링 빈과 스프링 컨테이너) 1. 싱글톤 패턴이 왜 필요할까? 모든 설명에 나오는 예시 프로젝트의 설계 방식은 아래 링크를 참고 https://imgzon.tistory.com/114 스프링은 기본적으로 온라인, 그중에서도 웹 애플리케이션을 개발하기 위해 탄생하였다.(물론, 웹이 아닌 애플리케이션 개발도 가능은 하다) 일반적인 웹 애플리케이션이라면, 보통 여러 고객들이 동시에 요청을 한다. 이때, 스프링을 적용하지 않은 순수한 DI 컨테이너로 작성한 경우, 요청을 받을때마다 객체를 새로 생성한다. -> 만일 요청이 1초에.. 2023. 1. 10.
[Spring] 컴포넌트 스캔(@ComponentScan), 의존관계 자동 주입, 롬복(lombok) 0. 개요 이번 게시물에서는 스프링 컨테이너에 스프링 빈을 컴포넌트 스캔으로 추가하는 방법에 대해 작성할 것이다. 해당 게시물을 보기 전, 아래 링크의 글을 보고 오는 것을 추천한다. (스프링 빈과 스프링 컨테이너) (스프링 빈 자바코드로 수동 등록) 1. 자바 코드로 수동 등록의 한계 모든 설명에 나오는 예시 프로젝트의 설계 방식은 아래 링크를 참고 https://imgzon.tistory.com/114 스프링 컨테이너를 @Bean을 통해서 수동 등록할 경우, 예제와 같이 3~4개정도면 충분히 작성 할 수 있다. 하지만 빈이 수백개가 된다면? 설정 정보 클래스도 커지고, 누락하는 문제도 발생할 수 있다. 그래서 스프링은 @ComponentScan을 통해 자동으로 스프링 빈을 등록하고, @Autowire.. 2023. 1. 10.
[Spring] 스프링 빈 자바 코드로 수동 등록(@Configuration, ApplicationContext) 0. 개요 이번 게시물에서는 스프링 컨테이너에 스프링 빈을 자바 코드(직접 만든 DI 컨테이너)로 추가하는 방법에 대해 작성할 것이다. 해당 게시물을 보기 전, 아래 링크의 글을 보고 오는 것을 추천한다. (스프링 빈과 스프링 컨테이너) 1. AppConfig 스프링 기반 변경 모든 설명에 나오는 예시 프로젝트의 설계 방식은 아래 링크를 참고 https://imgzon.tistory.com/114 우선 예시 프로젝트에서 사용할 DI 컨테이너를 작성해보자. public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } public OrderService order.. 2023. 1. 9.
[Spring] 스프링 빈과 스프링 컨테이너 0. 스프링 부트로 처음 접하면.. 스프링 부트로 스프링 개발을 처음 접하게 되면, 스프링 빈이라는 개념을 인지하지 못한체 개발을 시작하게 될 것이다. 책, 혹은 구글링한 코드를 보며 @SpringBootApplication, @RequiredArgsConstructor, @Controller, @Service와 같은 어노테이션을 쓰기만 해도 프로젝트가 정상적으로 작동하기 때문이다! 하지만 개발을 해보다 보면 "그래서 이게 어떤 원리로 작동하는 거지?", "이 어노테이션은 왜 붙이는거지?" 와 같은 궁금증이 생기게 된다. "@RequiredArgsConstructor가 final 혹은 @NotNull이 붙은 생성자를 생성해주는 건 알겠는데, 생성자가 왜 필요하지?" 같은 고민들을 해결하기 위해서는 우선 .. 2023. 1. 9.
[Spring] 예시 스프링 프로젝트 설계 0. 개요 이 게시물은 앞으로 작성할 스프링 게시물들에 등장할 예시 프로젝트의 구성을 설명하는 글이다. 1. 비즈니스 요구사항과 설계 예시 프로젝트의 구조는 크게 회원, 주문, 할인 정책 3가지로 나뉜다. - 회원 - 회원을 가입하고, 조회할 수 있다. - 회원은 일반, VIP 2가지 등급이 있다. - 회원 데이터는 자체 DB를 구축할 수도 있고, 외부 시스템과 연동할 수도 있다. - 주문과 할인 정책 - 회원은 상품을 주문할 수 있다. - 회원 등급에 따라 할인 정책을 적용할 수 있다. - 할인 정책은 변경 가능성이 높으며, 현제 2가지 정책을 고민하고 있다. - 1) 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용하자. - 2) 모든 VIP는 구매 금액의 10%를 할인해주는 정책을 적용하.. 2023. 1. 9.
자바(Java) - static import 1. static import - 일반적인 import와 다르게, static import을 하게 될 시 라이브러리의 메서드, 혹은 변수를 클래스명 없이 접근 가능하게 해준다. - 예를 들어보면, import static java.lang.Math.PI; System.out.println(PI); - 일반 import라면 Math.PI라고 작성해야 한다. - 사실 굳이 이렇게 줄여야 하나? 라고 생각할 수 있으나, 가독성 측면에서 도움이 될 수 있다. - 다음 예시를 보자. import org.assertj.core.api.Assertions; import static org.assertj.core.api.Assertions.*; public class StaticImportTest { @Test voi.. 2022. 12. 17.
[Spring] IOC, DI, 컨테이너 1. 제어의 역전 IOC (Inversion of Control) - 보통 프레임워크 없이 개발 할 경우, 객체의 생성, 설정, 초기화, 메서드 호출, 소멸, 즉 한 객체의 모든 것을 프로그래머가 직접 관리한다. - 하지만 프로그래머가 작성한 객체, 그리고 포함된 메서드를 개발자가 아닌, 외부에서 제어하는 것을 제어의 역전(IOC)이라고 한다. - 따라서 프로그래머는 핵심 코드 개발에 더 집중할 수 있고, 프로그램의 제어 책임은 프레임워크로 넘어간다는 장점이 있다. - 위에서 자주 나온 내용인 "프레임워크"와 우리가 일반적으로 사용하는 라이브러리를 구분하는 방법은 다음과 같다. -> 프레임워크 : 내가 작성한 코드를 제어하고, 대신 실행한다. -> 라이브러리 : 내가 작성한 코드를 직접 제어한다. (내가.. 2022. 12. 17.
[Spring] 객체 지향 설계와 스프링 1. 스프링 - 이전 글에서 다형성만으로는 OCP와 DIP를 지킬 수 없다는 내용을 작성하였다. - 스프링은 아래의 기술들로 다형성과 OCP, DIP를 가능하도록 지원해줌 -> DI(Dependency Injection): 의존관계, 의존성 주입 -> DI 컨테이너 제공 - 위 기능들을 활용하면, 클라이언트 코드의 변경 없이, 기능이 확장 가능해진다. (즉, 쉽게 부품을 교체하듯이 개발 가능) 2. 지금까지 내용 정리 - 해당 카테고리의 첫번째 게시물부터 지금까지 내용들을 한번 정리해보자. - 모든 설계에 역할과 구현을 분리하자. - 애플리케이션을 설계할 때, 마치 공연을 설계하듯 배역만 만들어두고, 배우는 언제든지 변경할 수 있도록 유연하게 설계하는 것 -> 이것에 좋은 객체 지향 설계이다. -> 이것.. 2022. 5. 26.