[Spring] 강의 끄적

누구세요·2024년 9월 27일

@Bean

등록시에는 앞글자가 소문자로 바뀌어서 저장된다.

@Component

클래스 위에 달면 Bean에 등록한다.

@AutoWired

생성자하 하나일때만 생략가능하다. IOC컨테이어에 의해 관리되는 클래스만 사용 가능하다.
ex) @Component

@RequiredArgsConstructor

final이 붙거나 @NotNull 이 붙은 필드의 생성자를 자동 생성해주는 롬복 어노테이션

Layer Annotation

  • Spring 3 Layer AnnotationController, Service, Repository의 역할로 구분된 클래스들을 Bean으로 등록할 때 해당 Bean 클래스의 역할을 명시하기위해 사용됩니다.
    1. @Controller, @RestController
    2. @Service
    3. @Repository
  • @Component가 아닌 3 Layer Annotation을 사용해도 무관하다.

흐름

어플리케이션을 Run하면

  1. @ComponentScan@Component을 읽어서 Bean으로 등록
  2. @AutoWired ..즉 DI주입이 필요한 것들에 Bean들을 주입한다. (필요한 코드들을 자동으로 생성한다고 보면 된다.)

ApplicationContext

  • ApplicationContextBeanFactory등을 상속하여 기능을 확장한 Container 입니다.
  • BeanFactory는 Bean 의 생성, 관계설정등의 제어를 담당하는 IoC 객체입니다.
  • IOC컨테이너라고 생각하면 된다.
public MemoService(ApplicationContext context) {
        // 1. 'Beab' 이름으로 가져오기
        // MemoRespository memoRepository = (MemoRespository) context.getBean("memoRespository");

        // 2. 'Bean' 클래스 형식으로 가져오기
        MemoRespository memoRepository = context.getBean(MemoRespository.class);
        this.memoRepository = memoRepository;
    }

[ 3 Layer 아키텍처 ] 마무리

Spring에서 IOC컨테이너에서 컨트롤러 빈을 찾아서 사용하라고 전달한다.

@SpringBootApplication

exclude: 특정 클래스를 자동 설정에서 제외함

@Enumerated(value = EnumType.STRING)

  • Enum타입을 DB에 저장할 때 사용한다.
  • Enum이름 그대로를 반환한다.

mppedBy = "user"

  • 여기서 user부분에 들어가는 부분은 외래키의 주인인 상대 엔티티에 있는 필드명을 의미한다.
  • 즉 외래키 주인의 필드

연관관계 주의할 점

  • 외래 키 주인만이 외래 키 를 등록, 수정, 삭제할 수 있으며, 주인이 아닌 쪽은 오직 외래 키를 읽기만 가능합니다. 직접
    • this를 사용해 직접 연관관계를 설정해 주는 것은 괜찮다.
  • 주인이 아닌쪽에서 주인의 정보를 넣어주지 않아도 DB에 문제는 없지만 다음과 같은 상황에서는 문제가 생길 수 있다.
    • InsertSelect 쿼리를 날리지 않고 바로 보려고 한다면 주인이 아닌쪽은 동기화가 되지 않는다.

영속성 전이 주의할 점

  • cascase옵션을 사용하여 영속 상태의 Entity에서 수행되는 작업들이 연관된 Entity까지 전파한다.
  • 조회할때는 보통 @Transactional을 붙이지 않아도 된다. 다만fetch = FetchType.LAZY일 경우 영속성 컨텍스트가 유지돼어야 다른쪽 엔티티를 조회할 수 있다.
  • Delete쿼리를 날릴땐 cascade.REMOVE옵션을 달면 연관된 테이블도 같이 수행한다.
  • 쿼리를 날리지 않고 엔티티에서 바로 삭제하려면 orphanRemoval = true로 설정한다.
    • cascade.REMOVE 기능도 포함하고 있다.
    • ManyToOne에서는 사용할 수 없다.

@Scheduled

일정시간마다 동작을 수행할 수 있게 해준다. 시작부분에 @EnableScheduling을 붙여줘야 한다.

0개의 댓글