300x250
프록시 패턴 프록시 패턴은 하나의 객체가 다른 객체의 대리자 역할을 하도록 설계하는 디자인 패턴으로 대리자는 실제 객체와 동일한 인터페이스를 가지며, 클라이언트는 실제 객체를 직접 사용하는 대신 대리자를 통해 간접적으로 상호작용한다. 이 패턴을 사용함으로써 얻는 이점은 다음과 같다 : 1. 로깅 : 프록시 객체는 클라이언트의 요청과 실제 객체의 작업 결과를 로깅할 수 있다. 2. 보안 강화 : 프록시 객체가 클라이언트의 요청을 검증하고 필요한 권한 확인 등의 작업을 수행함으로써 보안상의 이점을 가져간다. 3. 성능 최적화 : 실제 객체가 생성 및 초기화에 많은 비용이 드는 경우, 프록시 객체를 사용하여 실제 객체가 필요한 시점에 생성하거나 초기화할 수 있다. 스프링에서는 프록시 객체를 만드는 여러 가지 ..
서론 최근에 인턴 면접관으로 참여할 일이 생겨 지원자들이 제출한 코드를 훑어보던 중 재밌는 코드를 발견했습니다. @Component public class SessionStore { // key : userId // value : session string private final HashMap memorySession = new HashMap(); // CRUD method ... } 바로 유저의 세션을 인 메모리 방식으로 관리하는 컴포넌트가 정의되어 있었습니다. 유저의 세션을 인 메모리 방식으로 구현한 것도 흥미로웠는데 무엇보다 싱글톤 빈에 정의한 멤버 변수에 이목이 끌렸습니다. 빈의 생명주기에 대해서 공부할 때 줄곧 싱글톤 빈에 상태를 저장하지 말라고 배웠으니 말이죠. 그렇다면 앞선 코드는 정상 동..
✍️ 서론 이벤트의 콜백 메서드를 인터페이스의 추상 메서드로 정의하고, 이벤트에 관심 있는 클래스는 콜백 인터페이스를 구현함으로써 간단한 Listener를 만들 수 있다. 예제 코드로 이해해 보자. 여기 Member의 가입 로직이 포함된 MemberService가 있고, @Service public class MemberServiceImpl implements MemberService { @Autowired private MemberDao memberDao; @Override public void join(int memberId, String name) { Member exist = memberDao.get(memberId); if (exist != null) throw new RuntimeExcepti..
✍️ Argument Resolver, 아규먼트 리졸버 개념 Argument Resolver란, Client가 요청한 Request로부터 값을 참조하거나 객체를 생성해서 Handler(Controller)의 파라미터에 바인딩 할 때 사용하는 객체이다. 가령, 로그인 인증을 마친 Client가 Server로부터 자신의 UserId가 기입된 인증용 Token을 발급받았다고 가정해 보자. Client는 Request를 보낼 때마다 인증의 일환으로 Token을 보낼 것이고, Server는 유효한 토큰인지 검증을 거친 후 (필요에 따라) 토큰에 저장된 UserId를 꺼내서 Client의 요청을 처리할 것이다. Argument Resolver 없이 단순 User 조회 Controller는 다음과 같이 세 단계에 걸..
✍️ Interceptor, 인터셉터 개념 사전적인 의미로 Intercept란 가로막다, 가로채다라는 의미를 가지고 있다. 이와 유사하게 Spring에서 제공하는 Interceptor도 Cilent의 Request와 Server의 Response를 가로채는 역할을 한다. 일반적으로 Login 검증, Token 검증에 Interceptor가 사용된다. Spring이 Request를 처리하는 흐름에서 인터셉터를 살펴보면 1. Client로부터 Request가 들어오면 프론트 컨트롤러인 DispatcherServlet이 이를 가장 먼저 받는다. 2. DispatcherServlet은 HandlerMapping을 거쳐 Request를 처리할 Controller를 찾는다 3. Controller를 찾고 나서, H..
본 포스팅의 내용은 인프런 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 기반으로 작성했습니다. 🌱 AOP가 필요한 상황 예를 들어, 모든 메서드의 호출 시간을 측정하고 싶다면? 어느 날 직장 상사가 어플리케이션의 모든 메서드 호출 시간(초)을 측정하라고 지시했다. 밤을 새며 아래와 같이 모든 메서드에 하나하나 시간 측정하는 로직을 추가했다. public class MemberService { private final MemberRepository memberRepository; public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } /..