728x90
Java & Spring
40

업데이트 쿼리에서 발생하는 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

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

위는 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

[Spring Boot 2] Spring Security - 간단 인증 구현과 내부 구조

Spring Security를 사용한 로그인(인증) 기능을 구현한다. 간단한 예시로 먼저 구현해볼 것이기 때문에 DB는 사용하지 않는다. Dependency dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' t..

Java & Spring 2024.03.03
728x90