본문 바로가기
  • Let's study
BackEnd/Spring

[Spring] @Component, @Transactional, JPA Auditing

by 코딩고수이고파 2026. 7. 31.

@Component

@Component는 스프링이 관리하는 객체(Bean)로 등록하는 기본 어노테이션이다.

스프링은 @Component가 붙은 클래스를 자동으로 Bean으로 등록하고 관리하며, 필요한 곳에 의존성 주입(DI)을 해준다.

@Component
public class MyComponent {

}

@Service, @Repository 등은 내부적으로 @Component를 포함하고 있다.

따라서 서비스 클래스에는 @Component보다 역할이 명확한 @Service를 사용하는 것이 가독성이 좋다.

의존성 주입(DI)

객체를 주입하는 방식은 크게 두 가지로, 필드 주입(@Autowired)과 생성자 주입이 있다.

두 방식 모두 의존성 주입(DI)을 위한 방법이지만, 객체가 연결되는 시점이 다르다.

  • @Autowired → 객체가 생성된 후 Bean을 연결 / 객체를 먼저 만들고 필요한 객체를 나중에 넣어준다.
  • 생성자 주입 → 객체를 생성하면서 Bean을 함께 전달 / 객체를 만들 때부터 필요한 객체를 함께 전달받는다.

현재는 생성자 주입을 권장한다.

서비스나 Repository 객체는 대부분 하나만 생성하여 사용하므로 변경될 일이 거의 없다.

따라서 final과 @RequiredArgsConstructor를 함께 사용하면 간결하게 의존성을 주입할 수 있다.

@Service
@RequiredArgsConstructor
public class PostService {

    private final PostRepository postRepository;

    public Post write(String title, String body) {
        Post post = new Post(title, body);
        return postRepository.save(post);
    }

    public Optional<Post> findById(int id) {
        return postRepository.findById(id);
    }

    public long count() {
        return postRepository.count();
    }
}
 

@RequiredArgsConstructor는 final 필드를 매개변수로 받는 생성자를 자동으로 만들어 준다.

@Transactional

@Transactional은 메서드에서 실행되는 여러 SQL을 하나의 트랜잭션으로 묶어주는 어노테이션이다.

트랜잭션(Transaction)은 데이터베이스에서 하나의 작업 단위를 의미한다.

동작 과정은 다음과 같다.

  • 메서드 실행 중에는 DB에 바로 반영되지 않는다.
  • 중간에 예외가 발생하면 모든 작업을 취소한다.(Rollback)
  • 메서드가 정상 종료되면 한 번에 DB에 반영한다.(Commit)
@Transactional
public void save() {
    ...
}

조회 전용 트랜잭션

조회만 수행하는 메서드는 readOnly = true를 사용하면 성능을 최적화할 수 있다.

@Transactional(readOnly = true)
public Post findById(int id) {
    ...
}
 

JPA는 대부분 jakarta.persistence 패키지를 사용하지만, @Transactional은 org.springframework.transaction.annotation.Transactional을 사용한다.

JPA Auditing

등록일과 수정일을 자동으로 관리하기 위해 JPA Auditing 기능을 사용할 수 있다.

엔티티 설정

@EntityListeners(AuditingEntityListener.class)
@Entity
public class Post {

    @CreatedDate	//엔티티 생성 시간을 자동 저장
    private LocalDateTime createDate;

    @LastModifiedDate	//엔티티 수정 시간을 자동 갱신
    private LocalDateTime modifyDate;
}

메인 클래스 설정

@EnableJpaAuditing
@SpringBootApplication
public class Application {

}

설정 후에는 등록일과 수정일을 직접 관리하지 않아도 JPA가 자동으로 값을 저장하고 갱신해 준다.

'BackEnd > Spring' 카테고리의 다른 글

[Spring] intelliJ 세팅  (0) 2026.07.31
[Spring] JPA 기초  (0) 2026.07.30

댓글