23.02.05

Kuno17·2023년 2월 5일
0

TIL/WIL

목록 보기
16/38
post-thumbnail

학습

Java 개념

  • 객체지향에서 상속과 인터페이스

상속과 포함 : https://kuno17.notion.site/5-513f1647077340338e441ae62082b05f
인터페이스 : https://kuno17.notion.site/9-interface-c46f5da719de4b8abd4599596f5fbf46

spring

  • @Controller의 역할과 사용법
  • @Transactioanl import시 에러 발생 및 해결방법
  • Memo CRUD실습 진행.

import javax.transaction.Transactional;
import org.springframework.transaction.annotation.Transactional;

이런 경우는 보통 import 한 package가 올바르지 않아서 생기는 문제이다.

나는 확인해봤더니 javax.transaction.Transactional을 import하고 있었다.

Spring AOP

AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍

❓관점지향 👉 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것.

❓모듈화 👉 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것

  • 핵심적인 관점은 결국 우리가 적용하고자 하는 핵심 비즈니스 로직이 된다.

  • 부가적인 관점은 핵심 로직을 실행하기 위해서 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등

String AOP 종류는 2가지로 나누어진다.
1. JDK Dynamic Proxy
2. CGLIB

❓ Proxy 👉 대신이라는 의미를 가진다.

  • 프로토콜에 있어서 대리 응답 등에서 사용하는 개념.
  • 보안상의 문제로 직접 통신을 주고받는게 아니라 프록시를 이용해서 중계를 하는 개념으로 볼 수 있다. 즉 프록시 서버 = 중계기능

JDK Dynamic Proxy

java.lang에 포함되어 있는 Reflection의 Proxy 클래스가 말 그대로 동적으로 생성한다고 하여 Dynamic Proxy라고 부른다. 타겟의 Interface를 기준으로 Proxy를 생성한다는 것이 Dynamic Proxy의 핵심이라고 할 수 있다.

CGLIB (Code Generator Library)

스프링 부트는 CGLIB가 default다. CGLIB는 클래스의 바이트 코드를 조작하여 프록시 객체를 생성하는 라이브러리이다. CGLIB를 사용하여 인터페이스가 아닌 타겟에 대해서 프록시를 생성할 수 있다.

@Transactional

@Transactional을 메소드 또는 클래스에 명시하면, AOP를 통해 타겟이 상속하고 있는 인터페이스 또는 타겟을 상속한 프록시 객체가 생성된다. 이때 프록시 객체의 메소드를 호출하면 타겟 메소드 전 후로 트랜잭션 처리를 수행한다

@Transactional으로 생성된 프록시 객체는 @Transactional이 적용된 메소드가 호출될 경우,

PlatformTransactionManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit/Rollback 동작을 수행한다.

ex)code

service 에서 deletMemo()메소드를 프록시 객체로 생성

    @Transactional
    public Long deleteMemo(Long id){
        memoRepository.deleteById(id);
        return id;
    }

@Transactional 어노테이션을 붙이면 트랜잭션 처리를 위해 Proxy 객체를 생성하는데, Proxy는 Target Class를 상속하여 생성된다. 따라서 상속이 불가능한 Private 메소드의 경우 @Transactional 어노테이션을 적용할 수 없다는 것을 주의해야 한다.

profile
자바 스터디 정리 - 하단 홈 버튼 참조.

0개의 댓글