티스토리 뷰

@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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함