티스토리 뷰
@Component
설명: 해당 클래스를 스프링 빈으로 등록.
사용 시기: 일반적인 빈 등록이 필요할 때.
@Service
설명: @Component의 확장. 서비스 계층 클래스에 사용.
사용 시기: 비즈니스 로직을 처리하는 클래스에 사용.
@Repository
설명: 데이터 액세스 계층(DAO)에 사용. 예외 처리를 Spring이 자동으로 처리.
사용 시기: JPA나 JDBC 등 DB 관련 작업 클래스에 사용.
@Controller
설명: 웹 요청을 처리하는 컨트롤러 클래스에 사용.
사용 시기: Spring MVC의 요청/응답 처리 클래스.
@RestController
설명: @Controller + @ResponseBody 조합. JSON 형식으로 응답.
사용 시기: REST API 작성 시 주로 사용.
@Autowired
설명: 스프링이 의존성 주입(DI)을 자동으로 수행.
사용 예시:
@Autowired
private UserRepository userRepository;
주의: 생성자 주입이 더 권장됨. (테스트 용이성, 순환참조 방지 등)
@Value
설명: application.yml 또는 .properties 파일의 값을 주입.
사용 예시:
@Value("${spring.datasource.url}")
private String dbUrl;
@Configuration
설명: 설정 클래스임을 명시. 내부에 @Bean 메서드를 정의.
사용 예시:
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
@Bean
설명: 메서드의 리턴값을 스프링 빈으로 등록.
사용 시기: 외부 라이브러리 등의 객체를 수동으로 등록할 때.
@Transactional
설명: 해당 메서드 또는 클래스에 트랜잭션을 적용.
사용 예시:
@Transactional
public void saveUser(User user) {
userRepository.save(user);
}
사용 시기: 데이터베이스 작업 시 원자성 보장이 필요할 때.
원자성: 여러 작업을 하나의 단위로 묶어서 전부 성공하거나, 전부 실패하게 만드는 것
갑자기 궁금해진 트랜잭션의 4가지 성질(ACID)
1. Atomicity (원자성)
정의: 하나의 트랜잭션 내에 수행된 여러 작업을 “모두 성공”하거나 “모두 실패”하게 보장
예시: 돈 이체 시 출금과 입금 중 하나라도 실패하면 두 작업 모두 롤백되어, 출금도 입금도 일어나지 않음
Spring 역할: @Transactional이 붙은 메서드에서 예외가 발생하면 자동으로 전체 작업을 되돌림.
2. Consistency (일관성)
정의: 트랜잭션이 시작되기 전과 완료된 후에 데이터베이스가 정의된 규칙(무결성 제약조건 등)을 항상 만족해야 함
예시: 계좌 잔액이 음수가 될 수 없다는 제약이 있으면, 트랜잭션 완료 후에도 잔액 제약을 위반하지 않음
Spring 역할: 제약조건 위반 시 예외를 던져 트랜잭션을 롤백함.
3. Isolation (격리성)
정의: 동시에 실행되는 여러 트랜잭션이 서로의 중간 상태를 “보지 못하게” 함
예시: A가 계좌 잔액을 수정 중일 때 B는 그 변경 전(또는 변경 후) 데이터만 보고, 중간 값은 보지 못함
격리 수준:
READ UNCOMMITTED: 커밋되지 않은 데이터도 읽음 (더티 리드 허용)
READ COMMITTED: 커밋된 데이터만 읽음
REPEATABLE READ: 같은 쿼리에 대해 같은 결과를 보장
SERIALIZABLE: 가장 엄격, 완전한 직렬화 보장
Spring 역할: @Transactional(isolation = Isolation.REPEATABLE_READ) 처럼 원하는 격리 수준 설정 가능
4. Durability (지속성)
정의: 트랜잭션이 커밋된 이후의 변경사항은 영구적으로 보존됨
예시: 시스템 장애가 발생해도, 커밋된 입금 기록은 손실되지 않음
DBMS 역할: 커밋 시 로그나 디스크에 영구 기록하여 보장하며, Spring은 커밋 호출을 전달할 뿐.
이 네 가지를 잘 이해하고 @Transactional을 활용하면, 복잡한 DB 작업도 안전하고 일관되게 처리할 수 있다.
'JAVA' 카테고리의 다른 글
| Lombok에서 제공하는 어노테이션들!@ (0) | 2025.06.09 |
|---|
