개발 일지/Spring 44

[Spring] 트랜잭션 격리 레벨

트랜잭션 격리 레벨(Transaction Isolation Level)은 여러 개의 트랜잭션이 동시에 실행될 때, 각 트랜잭션들이 서로 영향을 미치지 않도록 하는 것을 의미한다. 트랜잭션은 ACID 원칙 중에서 독립적으로 실행되어야 하는 격리성이 보장되어야 하며, Spring은 @Transactional 애너테이션의 isolation 애트리뷰트를 통해 격리성을 조정할 수 있는 옵션을 제공한다. 적절한 격리 레벨을 선택하여 사용할 경우, 데이터 일관성을 보장하면서도 동시성 처리 성능을 향상시킬 수 있다. Isolation Level Isolation.DEFAULT : 데이터베이스에서 제공하는 기본값이다. Isolation.READ_UNCOMMITTED (레벨 0) : 다른 트랜잭션에서 커밋하지 않은 데이터..

[Spring] 트랜잭션 전파

트랜잭션 전파(Transaction Propagation)는 트랜잭션의 경계에서 진행 중인 트랜잭션이 존재하거나 존재하지 않을 때, 어떻게 동작할 것인지 결정하는 방식이다. 즉, 메서드 내에서 실행되는 코드가 이미 다른 트랜잭션 내에서 실행 중일 때, 해당 트랜잭션에서는 어떻게 동작할지를 정하는 것이다. Spring은 다양한 전파 속성을 제공하며, 이를 설정함으로써 트랜잭션 간의 상호작용 방식을 제어할 수 있다. 적절히 조합하여 데이터의 일관성과 안전한 처리를 보장할 수 있지만, 오용하게 된다면 오히려 복잡도가 증가할 수 있다. 그러므로 각 메서드의 역할과 트랜잭션 처리의 필요성 등을 고려해서 적절하게 전파 방식을 선택해야 한다. 트랜잭션 전파 방식 Propagation.REQUIRED : 일반적으로 가..

[Spring MVC] 트랜잭션

트랜잭션(Transaction)은 데이터베이스의 상태를 변화시키기 위한 하나의 논리적인 작업 단위를 의미한다. 데이터베이스의 상태를 변경하는 작업은 여러 개의 SQL 문으로 이루어질 수 있으며, 이러한 SQL 문들의 논리적인 작업 단위를 트랜잭션이라고 한다. 트랜잭션은 데이터베이스의 안정성과 일관성을 보장하는 데 매우 중요한 역할을 한다. 계좌 이체를 통해 돈을 송금하는 상황이 있다고 가정했을 때, 앱으로 송금을 눌렀지만 네트워크 오류로 인해 송금에 실패했다고 나왔다. 그런데 상대방의 계좌에는 정상적으로 돈이 송금되어 보낸 사람의 계좌에도 돈이 남아있고 받은 사람의 계좌에도 돈이 있다면 결국 은행이 금전적인 손해를 보는 상황이 발생할 것이다. 위처럼 애플리케이션의 신뢰성이 깨지는 상황이 발생하면 트랜잭션..

[Spring JPA] CASCADE

Cascade란 '영속성전이'라는 의미로, Entity의 상태 변화를 전파시키는 attribute이다. 만약 Cascade를 지정하지 않으면 상위 엔티티만 저장되고 하위 엔티티는 저장되지 않기 때문에, 상위 엔티티와 하위 엔티티 사이의 연관 관계를 다시 설정해줘야 한다. 따라서 Cascade를 추가함으로써, 상위 엔티티를 영속화할 때, 관련된 엔티티도 함께 영속화되어 연관 관계를 다시 설정해주지 않아도 된다. @ManyToOne 등에 옵션으로 줄 수 있고 만약 entity의 상태 변화가 있으면 옵션으로 준 entity에도 상태 변화를 전이시킨다. ex) @ManyToOne(cascade = CascadeType.ALL) private Member member; CascadeType ALL : 상위 엔티티..

[Spring JPA] 엔티티 간의 연관 관계 매핑

엔티티 클래스 간의 관계를 만들어주는 것을 연관 관계 매핑이라고 한다. Spring JPA에서 엔티티 간의 연관 관계 매핑은 객체지향 모델과 데이터베이스 모델 간의 일치를 보장하기 위해 사용된다. 이를 통해 객체 모델과 데이터 모델 간의 일관성을 유지하면서 객체를 사용하여 데이터베이스 작업을 수행할 수 있다. 연관 관계 매핑은 단방향 연관 관계와 양방향 연관 관계로 구분할 수 있다. A클래스와 B클래스가 있다고 가정하고 A는 B의 정보를 갖고 있지만 B는 A의 정보를 알 수 없을 때, 한쪽 클래스만 다른 쪽 클래스의 참조 정보를 가지고 있기 때문에 이 관계를 단방향 연관 관계라고 한다. 만약 둘 다 서로의 참조 정보를 갖고 있다면 양방향 연관 관계가 될 것이다. JPA는 단방향과 양방향 연관 관계를 모두..

[Spring] 엔티티 매핑

JPA를 이용해서 데이터베이스의 테이블과 상호 작용 하기 위해서는 데이터베이스의 테이블과 엔티티 클래스 간의 매핑 작업이 필요하다. Spring JPA에서 엔티티 매핑은 객체지향 프로그래밍과 관계형 데이터베이스 간의 매핑을 지원한다. 이를 통해, 객체 모델과 데이터 모델 간의 일관성을 유지할 수 있고 객체를 사용하여 데이터베이스 작업을 수행할 수 있다. 엔티티(Entity) 엔티티는 데이터베이스에서 저장되는 데이터를 나타내는 클래스이고 데이터베이스의 테이블과 매핑된다. @Entity 애너테이션을 사용해서 엔티티 클래스를 선언할 수 있다. 이 클래스는 기본 생성자를 가져야 하며, 모든 필드는 기본 생성자나 매개변수가 있는 생성자를 통해서 설정될 수 있어야 한다. 각 엔티티 클래스는 테이블의 열(column..

[Spring MVC] 예외 처리

@ExceptionHandler는 스프링 프레임워크에서 제공하는 애너테이션이다. Controller에서 발생하는 예외를 처리하는 메서드를 지정하는 데 사용되며, 예외가 발생하면 @ExceptionHandler 애너테이션이 붙은 메서드가 호출되어 예외를 처리하고 적절한 응답을 반환한다. @ExceptionHandler를 사용하면 전역 예외 처리가 가능해지며, 특정 컨트롤러나 메서드에서 발생한 예외를 쉽게 처리할 수 있다. 만약 에러가 발생했을 때, Response Body에 이에 적절한 설명이 담긴 메시지를 담지 않고 응답한다면 클라이언트는 요청 데이터 중에서 어떤 항목에서 문제가 발생했는지 알 수가 없을 것이다. 하지만 @ExceptionHandler를 이용하면 예외가 발생했을 때 클라이언트에게 적절한 ..

[Spring MVC] @Valid / @Validated

Spring MVC를 학습하는 도중에 @Valid와 별개로 @Validated를 추가하는 이유가 궁금해서 찾아보았다. 결론부터 얘기하자면 @Valid와 @Validated를 같이 사용하는 이유는 위 코드의 CoffeeController 클래스의 모든 메서드에 대해서 Spring의 제약 조건을 사용하여 데이터 유효성 검사를 수행하기 위해서이다. @Valid와 @Validated 애너테이션은 모두 메서드 파라미터에 적용되며, 메서드의 파라미터로 들어오는 입력 값의 유효성 검사를 수행하는 Spring Framework 애너테이션이다. @Valid 애너테이션은 Java Bean Validation API를 사용해서 데이터 유효성 검사를 수행하는데, 만약 입력 값이 제약 조건과 일치하지 않으면 'MethodArg..

[Spring MVC] @Rest + @Controller/@ControllerAdvice

@Controller / @RestController Spring에서 컨트롤러를 지정해 주기 위한 애너테이션은 @Controller와 @RestController가 있다. @Controller는 클래스를 SpringMVC 컨트롤러로 표시하는 데 사용되며, 주로 사용자의 요청을 처리하고 난 후 정해진 뷰에 객체를 넘겨주는 역할을 한다. @Controller는 전통적인 Spring MVC 컨트롤러이며, @RestController는 RESTful 웹 서비스 컨트롤러이다. Spring은 @Controller에 @ResponseBody를 추가해서 @RestController를 도입했으며, 이 둘은 HTTP Response Body가 생성되는 방식에 차이가 있다. @Controller는 Model 객체를 만들어 ..