Spring
-
템플릿 메서드 패턴, 팩토리 메서드 패턴, 전략 패턴, 템플릿 콜백 패턴Spring 2023. 5. 2. 20:46
템플릿 메서드 패턴(Template Method Pattern) 강아지와 고양이를 키운다고 상상해 보자. public class Dog{ public void playWithOwner(){ System.out.println("귀염둥이 이리온"); system.out.println("멍멍"); System.out.println("꼬리 살랑 살랑"); System.out.println("잘했어"); } } public class Cat{ public void playWithOwner(){ System.out.println("귀염둥이 이리온"); system.out.println("야옹야옹"); System.out.println("꼬리 살랑 살랑"); System.out.println("잘했어"); } } 위..
-
Spring의 주요 디자인 패턴Spring 2023. 4. 17. 20:18
디자인 패턴은 소프트웨어 개발의 필수적인 부분이다. 반복되는 문제를 해결해주며, 개발자로 하여금 자주 사용되는 패턴을 통해 프레임워크의 설계를 이해하도록 도움을 준다. Spring Framework에서는 여러 디자인 패턴을 적용하여 개발자의 부담을 덜어주고, 지루한 작업을 빠르게 수행할 수 있도록 도와준다. Spring Framework에서 가장 많이 사용되는 4가지 패턴 1. Singleton pattern 2. Factory Method pattern 3. Proxy pattern 4. Template pattern 1. Singleton pattern 싱글톤 패턴은 어플리케이션 당 오직 하나의 인스턴스만 존재하도록 보장해주는 패턴이다. 공유 자원을 관리하거나 cross-cutting services..
-
Spring 빈 스코프(Bean Scope) - 싱글톤, 프로토타입Spring 2023. 3. 30. 00:23
빈 스코프란? 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지될 수 있는 이유는 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스프링은 다음과 같은 다양한 스코프를 지원한다. 싱글톤(Singleton): 기본 스코프. 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프 프로토타입(Prototype): 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관하고 더는 관리하지 않는 매우 짧은 범위의 스코프 웹 관련 스코프 request: 웹 요청이 들어오고 나갈때 까지 유지되는 스코프 session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프 applicati..
-
Spring 필터(Filter), 인터셉터(Interceptor), AOPSpring 2023. 3. 16. 15:34
스프링은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 스프링에서 공통된 처리를 위해 필터, 인터셉터, AOP를 사용할 수 있다. 필터(Filter) 필터는 J2EE 표준 스펙 기능으로 디스패처 서블릿에 요청이 전달되기 전/후에 url 패턴에 맞게 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다. 디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리 되는 것이다. 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 되고, 디스패처 서블릿 전/후에 처리하는 것이다. 디스패처 서블릿(Displatcher Servlet) HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적..
-
Open EntityManager In View 필터Spring 2023. 2. 14. 02:38
Open EntityManager In View 필터는 JPA EntityManager(영속성 컨텍스트: DB에서 읽어온 객체들을 관리하는 컨텍스트. persistent 상태인 것을 관리)를 요청을 처리하는 전체 프로세스에 바인딩 시켜주는 필더이다. 스프링부트는 기본적으로 Open EntityManager In View를 설정해준다. persistent 상태인 객체들은 트랜잭션 안에서는 객체 상태의 변경만 감지하다가 트랜잭션이 종료될 때에 DB에 반영한다. 그러므로 데이터를 변경해야하는 일이 있는 경우, 트랜잭션 내에서 관리해주어야 한다. 뷰를 랜더링 할 때 까지 영속성 컨텍스트를 유지하기 때문에 필요한 데이터를 랜더링하는 시점에 추가로 읽어올 수 있다. (지연 로딩. Lazy Loading) 엔티티 객..
-
Spring의 @EventListenerSpring 2023. 1. 30. 01:43
이벤트 Spring의 @EventListener를 쓰는 이유는, 의존성이 강한 로직들을 분리하기 위해서이다. 애플리케이션을 만들다보면 서로 다른 서비스 간에 의존성이 발생하는 경우가 자주 생긴다. @Service public class StudyGroupService { public void create(String name) { // 스터디 생성 로직 System.out.println("스터디 생성 완료"); // 스터디 생성 메시지 전송 System.out.println(name + "스터디가 생성되었습니다."); } } 스터디를 생성하면 스터디 생성 완료 메시지 전송해주는 위의 코드는 몇가지 문제점이 존재한다. 1. 강한 결합 현재 스터디 생성 로직, 스터디 생성 메시지 전송 로직이 섞여있다. 이렇..
-
Entity와 DTO 분리하기Spring 2023. 1. 25. 15:53
Entity Entity 클래스는 실제 DB 테이블과 매핑되는 핵심 클래스로, 데이터베이스의 테이블에 존재하는 컬럼들을 필드로 가지는 객체이다. DB 테이블과 1:1로 매핑되며, 테이블이 가지지 않는 컬럼을 필드로 가져서는 안된다. Entity는 데이터베이스 영속성(persistent)의 목적으로 사용되는 객체이기 때문에, Entity 클래스가 변경되면 여러 클래스에 영향을 줄 수 있다. 이러한 이유로, Entity에서는 setter 메서드의 사용을 지양해야 한다. https://jinniedev.tistory.com/6 Setter 사용을 지양해야 하는 이유 Setter 사용을 지양해야 한다. 이유는 여러가지가 있지만, 가장 큰 두 가지 이유는 1. Setter를 사용하면 값을 변경한 의도를 파악하기 ..
-
Setter 사용을 지양해야 하는 이유Spring 2023. 1. 19. 16:42
Setter 사용을 지양해야 한다. 이유는 여러가지가 있지만, 가장 큰 두 가지 이유는 1. Setter를 사용하면 값을 변경한 의도를 파악하기 어렵다. public Member updateMember(long id) { final Member member = findById(id); member.setFistName("value"); member.setLastName("value"); return member; } 단순히 이렇게 setter로 값을 변경했을 때, 시간이 지나고 다시 위 코드를 봤을 때는 값을 왜 변경하게 되었는지 알기위해 코드를 역추적해서 찾아가야 한다. 2. 객체의 일관성을 유지하기 어렵다. 회원의 이름을 변경하는 메서드를 만들었다고 가정했을 때 무작정 setter로 값을 변경하게 되..