본문 바로가기

Spring29

[Spring-boot] JAR, WAR JAR(Java Archive), WAR(Web Application Archive)는 Java 애플리케이션을 패키징하는 두 가지 형식이다. 그렇다면 두 형식은 어떤 차이가 있을까?WAR웹 애플리케이션을 배포하는 데 사용되는 파일로 JAR는 JVM에서 실행된다면 WAR 파일은 WAS에서 실행된다.WAR 파일은 정적 리소스, 클래스 파일을 모두 함께 포함하므로 JAR보다 복잡한 구조를 가진다.WAR 파일의 구조는 다음과 같다.WEB-INF/: 웹 애플리케이션의 구성 파일과 비공개 리소스가 포함됩니다.classes : 실행 클래스 모음web.xml: 웹 애플리케이션의 배치 설명서.lib/: 애플리케이션에서 사용하는 JAR 파일.JSP, HTML, CSS 파일과 같은 리소스즉 WEB-INF 폴더 하위는 자바 .. 2024. 12. 28.
[Spring AOP] @Aspect AOP 스프링은 @Aspect 애노테이션으로 매우 편리하게 어드바이저를 생성할 수 있도록 지원한다.@Slf4j@Aspectpublic class LogTraceAspect { private final LogTrace logTrace; public LogTraceAspect(LogTrace logTrace) { this.logTrace = logTrace; } @Around("execution(* hello.proxy.app..*(..))") public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { TraceStatus status = null; try { S.. 2024. 12. 28.
[Spring AOP] 스프링 AOP와 용어 AOP 정의애플리케이션 로직은 크게 2가지로 나눌 수 있다.핵심 기능해당 객체가 제공하는 고유 기능부가 기능핵심 기능을 보조하기 위해 제공되는 기능으로 단독으로 사용되지 않고 핵심 기능과 사용여기서 부가 기능은 보통 하나의 클래스가 아닌 여러 곳에서 공통적으로 사용된다.이렇게 애플리케이션 전반적인 부분에 추가되는 부가 기능을 횡단 관심사라고 한다.하지만 일반적인 OOP 방식으로는 애플리케이션 전반에 사용되는 부가 기능 로직을 변경 지점이 하나가 되도록 처리하는데 어려움이 있다.따라서 부가 기능과 해당 기능을 어디에 적용할지 선택하는 기능을 합해서 하나의 모듈로 만들었는데 이를 애스펙트(aspect)라고 한다.Aspect는 이름 그대로 애플리케이션을 바라보는 관점을 하나하나의 기능에서 횡단 관심사(cros.. 2024. 12. 28.
[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.