spring boot
[JPA] hibernate bytecode enhancement 적용시 발생하는 오류 해결 (Failed to apply plugin 'org.hibernate.orm', gradle, kotlin)
발단OneToOne 관계를 맺은 테이블에서 Lazy Initialization 을 의도하였으나 의도한 바대로 동작하지 않고 FetchType.Eager 처럼 동작하여 이를 해결하기 위해 적용한 bytecode enhancement plugin 이 찾을 수 없다는 이유로 적용되지 않는 이슈를 해결하는 과정입니다. 환경Spring Boot 3.2.5data-jpa-starterhibernate-core 6.4.4.Final OneToOne 사용시 FetchType.Lazy 가 의도대로 동작하지 않는 이유 [JPA] bytecode instrumentation 을 이용한 lazy loading 활성화-10. @OneToOne 의 양방향 연관 관계 다대일, 일대다, 다대다 와는 다르게 @OneToOne 매핑은 ..
[Spring Boot] Spring Security 설정 과정에서 `please use permitAll via HttpSecurity#authorizeHttpRequests instead` 문구 발생(feat. ignoring)
발단spring security 를 적용하여 web 의 static resource 에 대한 접근시 권한과 무관하게끔 처리 하기 위한 설정으로 ignoring 을 사용하였는데 제목과 같은 문구가 발생하여 이를 제거하며 최적화한 과정을 정리합니다. 환경Spring Boot 3.1 Spring Security 6.1 # Spring Boot 3.1 버전 이상의 환경에서의 적용을 설명합니다. 문제 내용@Beanfun webSecurityCustomizer(): WebSecurityCustomizer { return WebSecurityCustomizer { web: WebSecurity -> web.ignoring().requestMatchers("/api/v1/test1") }}위 ..
[Spring Boot] Access denied for user 'root'@'localhost'(using password: yes)
발단테스트를 위해 생성한 프로젝트에서 DB 연결이 정상적으로 이루어지지 않았다. Client(HeidSQL, DataGrip)으로는 연결이 되었지만 Spring 에서 연결이 되지 않았기에 환경Spring Boot 3.2.5Mysql 8.0.36 설명다른 블로그를 찾아보니 `Access denied for user ...` 오류에 대한 해결방법은 3가지로 나뉜다. 하지만 본인은 아래 3가지 방법중 어떤 걸로도 해결되지 않았다. 1. Bitnami WAMP 로 인해 Listening 중인 서버가 동시에 떠있는 경우가 있는 듯 하다. - 보통 강의에서 사용되는 오픈소스 솔루션으로 PHP, Mysql 등의 프로그램을 쉽게 설치하는 방법인듯 하다. 2. 비밀번호 오류 - M..
[JPA] 연관관계를 맺은 객체에 대해 지연 로딩이 동작하지 않는다면(feat. kotlin, hibernate, lazy-loading)
발단 스케줄러 작업을 통해 주기적으로 DB 요청을 하는 상황에서 로그를 살펴보니 원하지 않았던 정보까지 요청하고 있어 어떻게 해결하게 되었는지 공유하고자 합니다. 환경 Spring Boot > 3.0 Kotlin Kotlin 의 final 정책 이해를 돕기 위해 간단히 Kotlin 의 정책에 대해 얘기해보고자 합니다. Effective Java, "Item 17: Design and document for inheritance or else prohibit it" `Effective Java` 2001 연도에 출판한 책으로 Java 의 효율적인 사용과 좋지만 흔히 사용되지 않은 개발패턴에 대해 언급한 저명한 서적입니다. 해당 책에서 `상속을 위해 디자인과 문서화 하지 않을거면 지양해라` 라는 챕터를 다룬..
[Gradle] Spring Boot + Gradle 환경에서 bootBuildImage 의 createdDate(생성 일자)의 표기가 1980년도로 되어있다면?(feat. kotlin, intellij)
발단 intellij 환경에서 gradle 플러그인을 통해 bootBuildImage 로 docker 의 image 를 관리할 때 생성일자가 과거로 설정되어있는 것을 확인하였다. 환경 Spring Boot 3.1.3(kotlin) build.gradle.kts 해결 tasks.withType{ ... createdDate = "now" // 또는 ISO 8601 규격에 맞는 값을 입력 } 참고 stack overflow 를 통한 원인 Spring Boot 2.3.0 buildpack builds image with creation date 40 years ago I've tried to use buildpack in a maven project with Spring Boot 2.3.0 running: m..
[DB] JPA 버전 다운그레이드 과정에서 동작하던 sql 이 동작하지 않는다면(feat. native query)
발단 정부 프레임워크 사용을 위해 기존의 spring boot v3 가 아닌 v2 로 다운그레이드를 진행하면서 sql 이 실행되지 않아 동작하지 않는 경우가 발생하였다. 프로젝트를 진행하며 DB 검색을 위한 조건이 많지 않다면 JPA 의 native query 를 사용하였습니다. 이 때 sql 작성시 `;`을 붙여 해당 query 의 끝을 의미하게 하였습니다. 환경 spring boot starter jpa 페이징과 같이 사용 ... 원인 Spring boot 의 다운그레이드를 언급한건 jpa 의 버전이 spring boot 버전에 따라 달라지는 것을 명시하기 위함이다. 마이그레이션 전에 동작했지만 이후 동작하지 않은 이유는 `;` 때문이었습니다. JPA 버전에 따른 sql 전처리? v3 에서는 `;` ..
[Spring Boot] Spring 에서 Redis 를 사용할 때 ConnectionFactory 를 왜 Bean 으로 등록해서 사용해야 할까?(feat. Kotlin, Lettuce, LettuceConnectionFactory was not initialized through afterPropertiesSet())
발단 RedisTemplate 의 connectionFactory 를 Bean 으로 등록된 RedisConnectionFactory 로 사용하는 예제가 많은데 왜 그래야 하는지 설명이 없어 궁금하여 찾아보게 되었다. (Bean 으로 등록하여 사용하지 않으면 `LettuceConnectionFactory was not initialized through afterPropertiesSet()` 오류가 발생한다.) 설명 Spring 에서 Redis 서버와의 연결을 위해 getConnection 메서드를 호출한다. getConnection 메서드 내부에는 assertInitialized 검증 메서드를 호출한다. assertIntialized 는 initalized 변수를 통해 초기화 여부를 판단하는데, 해당 변..
[Spring Boot] custom error page 적용(feat. 예제, ErrorController)
상황 Spring 을 통해 웹서비스를 제공할 때 오류가 발생하면 에러 페이지(white label, 위사진)에 도달하게 되는데, 해당 에러 페이지와 웹서비스의 디자인이 많이 다름으로 사용자로 하여금 혼란이 올 수 있다는 생각이 들어서 임의의 에러 페이지를 제공하고자 하였다. 간단한 설명 Spring 에서는 에러 페이지 생성을 위해 ErrorController 를 제공한다. ErrorController 를 사용하면 default 에러 페이지 핸들러를 대체하게 된다. 예제 코드 밑에 자세한 설명을 포함하였습니다. Custom Error Page 예제 View 생성 성공적으로 접근 되는 것을 확인하기 위한 페이지와, 에러 페이지 중에서 404 와 500 을 재연하기 위해 세개의 view 를 생성한다. inde..
[Spring Boot] Spring Boot 에서 JPA 로 값을 수정시 알 수 없는 이유로 sql 에러가 발생할 때(feat. SQL Error: 1064, SQLState: 42000)
발단 DB 에서 값을 변경하려고 JPA 를 통해 시도하였을 때 필자 입장에서는 단순한 VARCHAR(1) 구조의 필드 였음으로 수정되어 마땅한 상황이었지만, 왜인지 SQL Error: 1064, SQLState: 42000 오류가 지속적으로 발생하였다. 설명 필자가 사용한 테이블에는 DB 의 예약어를 포함하고 있었다 (예약어인지 모르고 필드로 사용). 테이블의 값을 수정하려 할 때 예약어를 수정하려 한 것은 아니지만, JPA 가 객체 형태로 영속성 매니저에게 값을 전달하고 있었기에 DB 에 전달한 query 를 실행하면서 syntax error 가 발생하게 된것이다. 예시 DB 구조 CREATE TABLE `test1` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `openYn..
[Spring Boot] Spring Boot(Kotlin) Gradle 환경에서 docker 이미지를 추출하는 방법(feat. bootBuildImage)
설명 환경 윈도우즈 docker desktop 설치됨 Spring Boot 프로젝트 kotlin Gradle 로 빌드툴을 설정했을 경우 다음과 같은 탭을 찾아볼 수 있다. Gradle 빌드 툴이 제공해주는 docker image 빌드 명령어이다. Image 저장되는 장소 아무런 설정을 하지 않았을 경우 docker 로컬에 저장된다. 이는 docker desktop 과 docker CLI 를 통해 확인 가능하다. docker command : docker images docker 이미지 변경 build.gradle.kts 파일에서 다음과 같이 작성할 경우 이미지명이 변경된다. tasks.getByName("bootBuildImage"){ imageName.set(".../request-test:latest..