728x90
분류 전체보기
521

업데이트 쿼리에서 발생하는 TransactionRequiredException

@Modifying @Query("update Alarm a set a.readAt = now() where a.id = ?1") void updateReadAtById(Long alarmId);위와 같이 알람의 readAt 속성 값을 현재 일시로 업데이트하는 쿼리메소드를 실행하면 다음과 같은 예외가 발생한다. TransactionRequiredException: Executing an update/delete query@Transactional예외를 해결하기위해서 @Transactional을 추가해주면 된다.@Transactional@Modifying @Query("update Alarm a set a.readAt = now() where a.id = ?1") void updateReadAtBy..

Java & Spring 2024.05.17

Dive into @Transactional

SimpleJpaRepository먼저 Spring JPA에서 기본으로 구현된 SimpleJpaRepository 코드를 확인했다. SimpleJpaRespository 는 전체 메소드에 @Transactional(readOnly = true) 를 적용하고 save, delete를 수행하는 메소드에서는 @Transactional 에 적용한 것을 확인했다. 일반적으로 조회할 때 사용하는 메소드 findById, findAll , 저장할 때 사용하는 메소드 save 가 SimpleJpaRepository 에서 구현된 메소드를 호출한다는 사실도 알게되었다. 따라서 직접 @Transactional을 추가/적용하지 않아도 Transaction이 걸리는 것을 로그를 출력하여 확인했다.@Transactional을 직..

Java & Spring 2024.05.17

프론트엔드와 백엔드 연동 시 CORS 에러

프론트엔드(React) 애플리케이션을 실행하면 localhost:5173, 백엔드(Spring Boot) 애플리케이션을 실행하면 localhost:8080이 지정된다고 할 때 프론트엔드에서 백엔드로 API 요청을 하게되면 CORS(Cross-Origin Resource Sharing)에러가 발생한다.NOTECORS(Cross-Origin Resource Sharing) 에러는 서로 다른 두 서버 간의 Origin(Protocol + Hostname + Port)이 다를 경우 발생한다. CORS에러를 해결하기위해 다음과 같은 방법들을 적용할 수 있다.1. WebMvcConfigurer@Configuration @EnableScheduling @EnableTransactionManagement publ..

Java & Spring 2024.05.17

[AWS] EC2(Public Subnet)와 RDS(Private Subnet) 설정

일반적으로 Amazon EC2에 Application을 배포하고 EC2를 통해 RDS에 접근한다. 이때 RDS는 Public이 아니라 Private으로 설정하여 외부에서 접근할 수 없도록 해줄 것이다. 그러기 위해서는 먼저 VPC를 생성하고 Public Subnet과 Private Subnet을 생성해야한다. 그리고 Public Subnet은 IGW(Internet Gateway)를 통해 외부와의 통신을 하기 때문에 Router Table에 IGW로부터 들어오는 요청에 대한 접근을 허용해주도록 설정한다. 반면 Private Subnet은 IGW가 아닌 EC2가 속해있는 Public Subnet에 대한 요청에 대한 접근을 허용해주도록 설정해준다. VPC (Virtual Private Cloud) 생성 VP..

Temp 2024.03.27

게시글의 좋아요를 업데이트할 때 발생할 수 있는 동시성 이슈

위는 ERD의 일부만 캡처한 이미지로 article에는 좋아요 수를 나타내는 like_count 속성이 있고 각 좋아요의 정보를 담는 article_like 테이블이 있다. 게시글의 좋아요를 업데이트하는 경우는 추가할 때, 혹은 삭제할 때 뿐이다. 당연히 기본 값은 0이 되어야할 것이다. 좋아요 추가 좋아요를 추가할 때를 기준으로 테스트를 해볼 것이기 때문에 추가하는 코드를 살펴보자. 편의를 위해 추가적인 메소드 코드와 엔티티 코드는 생략한다. @Transactional public void addArticleLike(Long articleId, Long userAccountId) { // 좋아요 추가 articleLikeRepository.save(ArticleLike.of(userAccountId, ..

Java & Spring 2024.03.20

[Spring Mail] 존재하지 않는 메일은 어떻게 확인하지?

이메일의 형식은 spring validation 등을 사용하여 확인할 수 있다. 다음과 같이 말이다. @NotBlank @Email String email 그렇다면 만약 존재하지 않는 메일일 경우 전송에 실패하게 될 것인데 서버에서는 어떻게 이 사실을 알아 낼 수 있을까? 메일 전송 먼저 메일 전송을 수행해보기위해 spring mail을 사용해볼 것이다. Dependency implementation 'org.springframework.boot:spring-boot-starter-mail' spring mail는 jakarta.mail에 의존한다. Properties application.yml 에도 다음과 같이 속성 값을 설정해준다. spring: mail: host: smtp.gmail.com po..

Java & Spring 2024.03.19

[Spring Security] @EnableWebSecurity 무엇을 해주는 걸까?

Spring Security는 첫 번째로 Configuration을 추가해주어야한다. Configuration은 springSecurityFilterChain라 불리는 모든 security에 대한 Servlet Filter를 생성한다. 아래 예시 코드는 Spring Security의 가장 간단한 Configuration이다. import org.springframework.context.annotation.*; import org.springframework.security.config.annotation.authentication.builders.*; import org.springframework.security.config.annotation.web.configuration.*; @Configura..

Java & Spring 2024.03.04
728x90