@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 |
댓글