본문 바로가기

Today I Learned/Spring13

[Spring] 여러가지 의존관계 주입 방식 생성자 주입 방식 4가지 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 의존관계 주입 방식은 위와 같이 4가지가 있다. 각각의 방식을 알아보고 생성자 주입 방식을 왜 써야하는지 알아본다. 생성자 주입 생성자를 통해서 의존관계를 주입받는 방식이다. 가장 대중적으로 쓰이고 선호되는 방식이다. 생성자 주입 방식은 생성자를 호출하는 시점에 딱 1번만 호출되는 것이 보장된다. 처음 주입이 이뤄지고 난 후에는 변경사항이 없다는 것이다. 생성자 주입 방식은 또한 필수적인 의존관계에 사용되는 방식이다. 다음 OrderServiceImpl 클래스 코드를 보자. @Component public class OrderServiceImpl implements OrderService { private .. 2023. 11. 3.
[Spring] 싱글톤을 관리하는 스프링 컨테이너 싱글톤 컨테이너 역할을 하는 스프링 컨테이너 스프링 컨테이너는 기존 싱글톤 패턴의 문제점을 해결하고 객체 인스턴스를 한 개만 생성하여 관리한다. 잘 알고 있는 스프링 빈이 스프링 컨테이너에 의해 싱글톤으로 관리된다. 스프링 컨테이너 싱글톤 객체를 관리하므로 여러 장점이 있는데, 먼저 싱글톤 패턴을 위해서 코드를 작성하지 않아도 된다는 점이다. 그리고 앞서 싱글톤 패턴의 문제점으로 말했던 DIP, OCP, 테스트, private 생성자로부터 제한없이 싱글톤을 사용할 수 있다. @Test void springContainer() { ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memb.. 2023. 11. 2.
[Spring] 싱글톤 패턴(Singleton Pattern) 요청 시 객체를 생성하는 구조 웹 어플리케이션이 있다. 고객들이 요청할 때마다 AppConfig(스프링 없는 순수한 DI 컨테이너)는 객체를 새로 생성할 것이다. 100개의 요청이 들어오면 100개의 객체가 생성이 되고 소멸 될 것이다. 이 서비스가 인기가 더 많아지면 초당 10,000개 이상의 객체를 생성하고 소멸될 수도 있다. 다음은 스프링이 없는 순순한 DI 컨테이너를 나타낸 코드이다. public class SingletonTest { @Test void pureContainer() { AppConfig appConfig = new AppConfig(); MemberService memberService1 = appConfig.memberService(); MemberService memberSe.. 2023. 11. 1.
[Spring] SOLID 좋은 객체 지향 설계의 5가지 원칙 SOLID 좋은 객체 지향 설계의 5가지 원칙 클린 코드의 저자로 유명한 로버트 마틴이 정리한 좋은 객체 지향 설계의 5가지 원칙이다. 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 개발하고자 하는 프로그래머들은 이 원칙들을 적용할 수 있다. SRP (Single Responsibility Principle) : 단일 책임 원칙 OCP (Open/Closed principle) : 개방/폐쇄 원칙 LSP (Liskov Substitution Principle) : 리스코프 치환 원칙 ISP (Interface Segregation Principle) : 인터페이스 분리 원칙 DIP (Dependency Inversion Principle) : 의존관계 역전 원칙 SRP 단일 책임 원칙 (Single R.. 2023. 10. 27.
[Spring] 프록시 서버 Proxy Server 프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 말한다. 즉, 클라이언트가 서버와 연결될 때 서버에 바로 접근하지 않고 자신을 통해 접근할 수 있도록 해주는 대리 역할을 하는 서버이다. 프록시 서버는 위치에 따라서 Forward Proxy와 Reverse Proxy 두 가지로 나뉜다. Forward Proxy 클라이언트에 가까이 위치한 프록시 서버를 Forward Proxy라고 한다. Forward Proxy는 클라이언트가 동일한 요청을 보낼 때 서버에 재요청을 하지 않고 캐시에 저장해놓은 결과 데이터로 응답한다. 따라서 요청 결과를 클라이언트에게 빠르게 전달할 수 있는 장점이 있다. 또한 서버에.. 2022. 10. 11.
[Spring] Spring Security의 웹 요청 처리 흐름 Spring Security를 애플리케이션에 적용하는데 어려움을 겪는 가장 큰 이유 중 하나는 Spring Security의 아키텍쳐와 Spring Security의 컴포넌트들이 어떻게 인터랙션해서 인증, 권한 등의 보안 작업을 처리하는지 이해하지 못하기 때문이다. 그리고 이러한 Spring Security의 동작 방식을 조금 더 잘 이해하기 위해서는 보호된 웹 요청을 처리하는 일반적인 처리 흐름과 Spring Security에서 지원하는 Filter의 역할을 이해하는 것이 선행되어야 한다. 따라서 오늘은 Spring Seucrity의 웹 요청 처리 과정 중에서 가장 기본이 되는 웹 요청의 일반적인 흐름과 Spring Security에서 지원하는 Filter의 역할에 대해 알아보겠다. 보안이 적용된 웹 .. 2022. 9. 28.
[Spring] Spring Security 커피를 주문할 수 있는 커피 주문 어플리케이션을 만들었다. 보안을 전혀 고려하지 않은 상태로 오픈을 하였다고 가정하면 어떤 문제가 발생할 수 있을까? 로그인(인증, Authentication) 기능이 없다. 로그인 기능이 없다면 자신을 증명할 방법이 없기 때문에 다른 사람이 회원으로 등록한 내 정보 또는 내가 주문한 정보 등에 대해서 애플리케이션의 API 호출해서 얼마든지 조회가 가능하게 된다. 이 상태로는 다른 사람의 개인정보를 탈취하는 것은 식은 죽 먹기가 될 것이다. API에 대한 권한 부여(인가, Authorization) 기능이 없다. 커피를 주문하는 손님은 메뉴판에 카페의 커피 정보를 마음대로 등록할 수 없어야 한다. 하지만 API에 대한 접근 권한이 부여되지 않는다면 손님이 마음대로 카페 메.. 2022. 9. 27.
[Spring] API 문서화 API 문서화 Controller는 클라이언트 쪽에서 HTTP request URL을 통해 클라이언트의 요청을 전달 받는다. 그런데 백엔드 애플리케이션은 REST API 방식의 애플리케이션이다. 따라서 API 문서화란 클라이언트가 REST API 백엔드 애플리케이션에 요청을 전송하기 위해서 알아야 되는 요청 정보(요청 URL(또는 URI), request body, query parameter 등)를 문서로 잘 정리하는 것을 의미한다. API 문서 생성의 자동화 API 사용을 위한 어떤 정보가 담겨 있는 문서를 API 문서 또는 API 스펙이라고 한다. API 문서는 개발자가 요청 URL 등의 API 정보를 직접 수기로 작성할 수도 있고, 애플리케이션 빌드를 통해 API 문서를 자동 생성할 수도 있다. .. 2022. 9. 26.
[Spring] JPA 엔티티 간 연관 관계 매핑 엔티티 클래스 간의 관계를 만들어주는 것을 연관 관계 매핑이라고 한다. 연관 관계 매핑은 참조하는 방향성을 기준으로 단방향 연관 관계와 양방향 연관 관계로 구분할 수 있다. 그리고 참조할 수 있는 객체의 수에 따라서 일대다(1:N), 다대일(N:1), 다대다(N:N), 일대일(1:1)의 연관 관계로 나눌 수 있다. 카페에서 커피를 주문할 수 있는 커피주문 애플리케이션에서 회원 정보인 Member 클래스와 주문 정보인 Order 클래스의 관계를 살펴보겠다. 단방향 연관 관계 위 그림에서 Member 클래스는 Order 객체를 원소로 포함하고 있는 List 객체를 가지고 있으므로 Order를 참조할 수 있다. 즉 Member는 Order의 정보를 알 수 있다. 반면에 Order 클래스는 Member 클래스에.. 2022. 9. 25.
[Spring] DTO(Data Transfer Object) DTO (Data Transfer Object) DTO는 Data Transfer Object의 약자로 마틴 파울러(Martin Fowler)가 ‘Patterns of Enterprise Application Architecture’ 라는 책에서 처음 소개한 엔터프라이즈 애플리케이션 아키텍처 패턴의 하나이다. Transfer 라는 단어에서 알 수 있듯이 데이터를 전송하기 위한 용도의 객체 정도로 생각할 수 있다. 바로 클라이언트에서 서버 쪽으로 전송하는 요청 데이터, 서버에서 클라이언트 쪽으로 전송하는 응답 데이터의 형식으로 클라이언트와 서버 간에 데이터 전송이 이루어지는데 이 구간에서 DTO를 사용할 수 있다. DTO가 필요한 이유 1. DTO 클래스를 이용한 코드의 간결성 @RestController.. 2022. 9. 24.
[Spring] Controller Controller 부트스트랩(Bootstrap) 애플리케이션이 실행되기 전에 여러가지 설정 작업을 수행하여 실행 가능한 애플리케이션으로 만드는 단계를 의미한다. @RestController Spring MVC에서는 특정 클래스에 @RestController를 추가하면 해당 클래스가 REST API의 리소스를 처리하기 위한 API 엔드포인트로 동작함을 정의한다. 또한 @RestController가 추가된 클래스는 애플리케이션 로딩 시, Spring Bean으로 등록해준다. @RequestMapping @RequestMapping은 클라이언트의 요청과 클라이언트 요청을 처리하는 Handler Method를 매핑해주는 역할을 한다. @RequestMapping을 Controller 클래스 레벨에 추가하여 클.. 2022. 9. 23.
[Spring] Spring MVC 아키텍처 Spring MVC Spring MVC는 클라이언트의 요청을 편리하게 처리해주는 프레임워크이다. 개발자들 사이에서 Spring Web MVC를 줄여서 Spring MVC라고 부르고, Spring MVC는 웹 프레임워크의 한 종류이기 때문에 Spring MVC 프레임워크라고도 불린다. Spring MVC에서 M은 Model을 뜻한다. 클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터를 Model이라고 한다. Spring MVC에서 V는 View를 의미한다. View는 Model 데이터를 이용하여 웹브라우저와 같은 클라이언트 애플리케이션의 화면에 보여지는 리소스(Resource)를 제공한다. 또한 View는 JSON 포맷의 데이터를 생성한다. Spring MVC에서 C는 Controller를 의미한다.. 2022. 9. 22.
[Spring] Spring Framework 특징(POJO, IoC/DI, AOP, PSA) Spring 삼각형 위 그림은 Spring 핵심개념들을 표현하는 Spring 삼각형이다. POJO라는 것을 IoC/DI, AOP, PSA를 통해서 달성할 수 있다는 것을 의미한다. POJO (Plain Old Java Object) Plain은 플레인 요거트를 떠올리면 이해하기 쉽다. 플레인 요거트는 과일이나 시리얼이 들어가지 않은 순수한 요거트를 의미한다. 즉 POJO란 Java로 생성하는 순수한 객체를 말한다. POJO를 이용해서 프로그래밍 코드를 작성하는 것을 POJO 프로그래밍이라고 하는데 이 POJO 프로그래밍에도 규칙이 있다. Java나 Java의 스펙에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 하며 특정 환경에 종속적이지 않아야 한다. POJO 프로그래밍이 필요한 이유 1. .. 2022. 9. 21.