분류 전체보기138 [Spring AOP] 빈 후처리기 일반적으로 @Bean이나 컴포넌트 스캔을 사용하면 스프링은 빈 객체를 생성하고 이를 스프링 컨테이너 내부의 빈 저장소에 등록한다.이 때 스프링 컨테이너에 의해 관리되는 빈의 초기화 전후에 특정 작업을 수행하고 싶다면 빈 후처리기 기능을 사용할 수 있다.빈 후처리기를 사용하면 빈 등록 과정은 아래와 같이 진행된다.스프링 빈 대상이 되는 객체를 생성 (@Bean, 컴포넌트 스캔 포함)생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달빈 후처리기는 전달된 스프링 빈 객체를 조작, 또는 다른 객체로 바뀌치기 할 수 있다.후처리 작업을 마치고 빈 후처리기가 빈을 반환반환된 빈이 빈 저장소에 등록빈 후처리기를 사용하려면 BeanPostProcessor 인터페이스를 구현한 후 스프링 빈으로 등록하면 된다... 2024. 12. 28. [Spring AOP] 포인트컷, 어드바이스, 어드바이저 스프링 AOP에서 빠질 수 없는 개념으로 포인트컷, 어드바이스, 어드바이저가 있다. 포인트컷(Pointcut): 어디에 부가 기능을 적용할지, 적용하지 않을 것인지 판단하는 필터링 로직주로 클래스와 메서드 이름으로 필터링한다.public interface Pointcut { ClassFilter getClassFilter(); MethodMatcher getMethodMatcher();}포인트컷은 크게 둘로 이루어진다.ClassFilter : 적용하려는 클래스가 맞는지 확인MethodMatcher : 적용하려는 메서드가 맞는지 확인일반적으로는 스프링이 제공하는 구현체를 사용한다.둘 다 true 로 반환해야 어드바이스를 적용할 수 있다.일반적으로는 스프링이 제공하는 구현체를 사용한다. 어드바.. 2024. 12. 28. [Spring AOP] 프록시 팩토리 이전 글에서 동적 프록시는 인터페이스의 존재 여부에 따라 다르다고 하였다.인터페이스 기반 프록시의 경우 InvocationHandler를 구현해야 하며, CGLIB의 경우 MethodInterceptor를 구현해야 한다.스프링은 이렇게 유사한 기술이 존재할 때 일관성있게 접근할 수 있도록 추상화된 기술을 제공한다.따라서 동적 프록시 기술을 통합해서 사용할 수 있도록 프록시 팩토리를 지원한다. 스프링은 부가 기능을 적용할 때 Advice라는 개념을 도입했다.프록시 팩토리를 사용하면 Advice를 호출하는 InvocationHandler, MethodInterceptor를 내부에서 사용한다.따라서 개발자가 핸들러, 인터셉터를 신경 쓸 필요없이 Advice만 생성하면 인터페이스든 구체 클래스든 프록시를 일관되.. 2024. 12. 28. [Spring AOP] 동적 프록시 프록시 패턴은 클라이언트가 원본 객체를 이용하는 것이 아닌 대리자를 거쳐서 원본 객체에 접근하는 디자인 패턴이다. 하지만 해당 패턴은 적용하려는 원본 객체의 수만큼 프록시 클래스를 생성해야 한다는 단점이 존재한다.이러한 단점을 해결하기 위해 JVM은 컴파일 시점이 아닌 런타임에 개발자 대신 프록시 클래스를 생성해주는 기능을 제공하는데 이를 동적 프록시라고 한다.프록시는 크게 두 가지 유형으로 나눌 수 있다.인터페이스 기반 프록시와 클래스 기반 프록시가 있는데 동적 프록시의 종류와 함께 이를 살펴보도록 하겠다.https://hbb-devlog.tistory.com/83JDK 동적 프록시JDK 동적 프록시 기능은 java.lang.reflect.Proxy 패키지에서 제공한다.해당 기능은 인터페이스를 기반으로.. 2024. 12. 28. [Spring] ThreadLocal 스프링에서 빈은 싱글톤으로 등록된다.즉 스프링 컨테이너에 딱 하나의 인스턴스가 생성된다는 의미이다.이렇게 싱글톤인 인스턴스를 여러 쓰레드가 동시에 접근하면 동시성 문제가 발생한다.동시성 문제여러 쓰레드가 동시에 똑같은 인스턴스의 필드 값을 변경할 때 생기는 문제를 뜻한다. 자바는 이러한 동시성 처리를 위해 ThreadLocal 이라는 클래스를 제공한다.ThreadLocal해당 쓰레드만 접근할 수 있는 저장소로 각 쓰레드가 독립적으로 변수의 값을 유지할 수 있도록 한다.멀티스레드 환경에서 쓰레드별로 상태를 저장할 때 사용된다.즉 하나의 필드에 대해 여러 쓰레드가 접근하더라도 쓰레드마다 독립적인 값을 가져 동시성 처리에 안전하다.이렇게 할 수 있는 이유는 ThreadLocal 내부에 Thread를 Key로 .. 2024. 12. 28. [Spring] @Transactional @Transactional스프링 프레임워크에서 트랜잭션 관리를 위해 사용하는 애노테이션으로, 메소드 또는 클래스에 적용할 수 있다.이 애노테이션이 적용된 메소드가 실행될 때, 해당 메소드 내의 작업을 트랜잭션으로 묶어주는 역할을 한다.기존에는 public 메서드에만 트랜잭션이 적용되었지만 스프링 6.0 부터는 protected와 default 메서드에도 트랜잭션이 적용되도록 바뀌었다.인터페이스에도 애노테이션을 적용할 수 있지만 가급적 권장하지 않는다.Method visibility and @Transactional in proxy mode The @Transactional annotation is typically used on methods with public visibility. As of 6.0,.. 2024. 12. 27. [Spring] JDBC, 커넥션 풀, 트랜잭션 추상화 JDBC란?Java Database Connectivity의 약자로, 자바 프로그래밍 언어에서 관계형 데이터베이스에 쿼리를 보내고 결과를 받을 수 있도록하는 APIJDBC 드라이버 → 각각의 DB가 자신의 DB에 맞도록 JDBC 인터페이스를 구현해서 제공하는 라이브러리요청 흐름JDBC 드라이버 로드 → JDBC가 제공하는 DriverManager 클래스를 통해 라이브러리에 등록된 DB 드라이버를 로딩데이터베이스 연결 → DriverManager를 통해 데이터베이스와 연결되는 세션인 Connection 객체 생성Connection connection = DriverManager.getConnection(url, user, password);SQL 문장 실행을 위한 Statement 객체 생성String s.. 2024. 12. 27. [Spring] MultipartFile 바인딩 일반적으로 HTML 폼 전송 방식에는 2가지 종류가 있다.application/x-www-form-urlencoded요청 HTTP 헤더에 Content-Type: application/x-www-form-urlencoded을 추가하여 전송하는 방식으로 HTML 폼 데이터를 서버로 전송하는 기본적인 방법이다.이는 폼에 입력한 항목을 쿼리파라미터 형식과 같이(username=hbb&age=20) &로 구분하고 이를 HTTP 바디에 문자로 전송하는 방식이다.multipart/form-data만약 위에서 이름, 나이 외에 첨부파일을 전송해야 한다면 어떻게 해야할까?첨부 파일의 경우 바이너리로 전송해야 하므로 문자와 바이너리를 동시에 전송을 해야하는 상황이 발생한다.따라서 HTTP는 multipart/form-d.. 2024. 12. 27. [Spring] 스프링의 예외 처리 스프링은 예외 처리를 위한 다양한 방법을 제공한다.1. BasicErrorController다음과 같은 컨트롤러가 있다고 하자.@RestController@RequestMapping("/exception")public class ExceptionController { @GetMapping("/login") public String loginException() { throw new LoginRequiredException("인증이 필요한 서비스입니다."); }}기본적으로 요청이 들어오면 다음과 같은 호출 과정을 거친다.WAS → 필터 → 서블릿 → 인터셉터 → 컨트롤러 근데 만약 컨트롤러에서 예외를 잡지 않고 throw 한다면 어떻게 될까?위에서 컨트롤러는 호출 시 직접 만든.. 2024. 12. 27. 이전 1 ··· 6 7 8 9 10 11 12 ··· 16 다음