개발
-
[돌다리 두들기기] Builder 패턴개발/JPA 2024. 4. 24. 14:43
JPA 엔티티에서 롬복의 @Builder 패턴을 사용할 경우 @AllAgrsConstructor와 @NoArgsContructor를 붙여야 한다. JPA 스펙에서 엔티티 클래스는 기본 생성자를 가져야 하며, @Builder에서 코드를 만들 때 필드를 받아서 객체를 생성하는 생성자를 필요로 한다. @Builder 패턴에서 생성되는 코드는 다음과 같다. 롬복의 코드와 똑같진 않지만 기본 흐름은 다르지 않다. public class Person { private String name; private int age; public static class PersonBuilder { private String name; private int age; ..
-
정리된 인증 과정개발/etc 2024. 4. 16. 16:42
별도의 인증 서버는 두지 않는다프론트엔드를 Next.js로만 구현하려고 했고 이는 키클록 인가 서버 혹은 스프링으로 인가 서버를 두게 되면 페이지를 Next.js로 개발하는 것에 한계가 있다. 키클록 인가 서버는 자체 페이지를 쓰거나 프리마커로 커스텀 하는 방식을 써야 하며, 스프링 인가 서버는 프레임워크에서 로그인 페이지를 렌더링해야 한다. 타임리프를 쓰면 되긴 하지만 이번 프로젝트에서는 직접 토큰을 다뤄보는 연습을 해보자.리소스 서버에서 토큰을 발행한다JJWT 라이브러리를 사용해서 토큰을 발행하고 클레임을 추출한다토큰 정책액세스 토큰의 만료 기간을 짧게 가져가고 리프레시 토큰의 만료 기간을 길게 가져가는 방식액세스 토큰이 유출됐을 때의 대안인데 리프레시 토큰이 유출되면 관리자가 무효..
-
[JPA][Archiving] in_clause_parameter_padding 옵션개발/JPA 2024. 3. 3. 12:38
이 글은 nhn cloud 기술 블로그에 올라온 글을 그대로 가져왔습니다. (원본 링크) Java ORM 기술의 표준 명세인 JPA가 소개된 지 참 오래되었지만, 국내 현실상 대규모 시스템에서 적용되어 사용된 운영 경험이 충분히 쌓이지 않고 공유되지도 않는 것 같습니다. 대부분 JPA를 사용한다고 하면 Hibernate를 구현체로 사용하게 됩니다. 제가 담당하는 서비스 역시 Spring Data JPA를 활용하고 있고 JPA 구현체로 Hibernate를 사용하고 있습니다. 개발과 서비스를 운영하면서 겪은 일 중에 SQL의 in 절과 관련해서 발생한 문제를 해결하면서 알게 된 옵션과 그로 인한 효과를 소개해 드리고자 합니다. 증상 운영 중인 서버가 이유 없이 응답이 느려집니다. 그리고 가비지 컬렉션을 너무..
-
Update개발/JPA 2024. 3. 3. 12:35
특정 필드만 업데이트 하려는 목적으로 코드를 작성하지만 JPA가 작성하는 query를 보면 해당 레코드 전체를 업데이트 한다. 이는 JPA가 어플리케이션을 로딩할 시점에 PreparedStatement로 해당 엔티티의 update query를 미리 만들어둔다고(참고 인프런 김영한님 답변). 해당 내용은 공식 문서에서 찾게 되면 해당 내용를 업데이트 하겠다. 어쨌든 오동작이나 최적화 문제는 아니라는 것을 알고 있자. 굳이 필요하면 @DynamicUpdate를 하이버네이트가 변경된 필드에 대해서는 업데이트하도록 할 수 있다. 아직 개발을 오래 한 건 아니지만 '굳이' 해야 되는 일은 대부분 안 해도 되는 거더라.
-
[Security6] Factory method 'securityFilterChain' threw exception with message: This object has already been built개발/Spring Security 2024. 2. 26. 01:52
시큐리티에서는 생전 처음 보는 버그가 종종 나와 미소 짓게 한다. 5버전과 달리 6버전에서는 설정 클래스가 상속하는 클래스가 없고 메소드 빈 방식으로 설정 작업이 이뤄지기 때문에Authentication Manager(이하 매니저)를 얻는 방식이 기존과 다르다. 여기서 소개할 방법은 사용자가 정의한 Authentication Provider(이하 프로바이더)를 추가하기 용이한 방법이다. 이 설정에서는 필터, 프로바이더를 새로 정의해서 등록한다. @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf(AbstractHttpConfigurer::disable); http.addFilterBefor..
-
[IntelliJ] 타임리프 및 클래스 변경 핫 리로드 적용하기개발/etc 2024. 2. 24. 01:13
application.yml spring thymeleaf: cache: false devtools: livereload: enabled: true restart: enabled: true 디펜던시에 devtools도 꼭 추가해주자. IntelliJ 메뉴 상단 Run -> Edit Configurations Modify optinos를 클릭해서 On 'Update' action과 On frame deactivation 에서 Update classes and resources를 해주면 된다. 새로고침 하면 타임리프와 클래스의 변경사항을 감지해서 서버 리스타트 혹은 리로드를 한다.
-
[Intellij] 다른 모듈의 클래스 사용하기개발/etc 2024. 2. 20. 15:57
메인 프로젝트 하위에 모듈들을 추가했고 공통 모듈 하나를 다른 하위 모듈들이 참조하는 형태다. 아래 이미지를 보면 authserver 모듈을 제외한 OAuth2Client, ResourceSercerFriend, ResourceServerPhoto가 SharedObject에 있는 클래스를 참조한다. 1. 최상위의 메인 프로젝트의 settings.gradle에 공유 모듈의 이름을 include 한다. 가장 윗줄에는 해당 프로젝트의 이름이 쓰여 있을 거다. Load Gradle Changes를 클릭해서 변경 사항을 빌드하도록 하자. 아이콘이 뜨지 않는다면 우측에 Gradle의 탭을 찾아가서 Reload를 해주자. rootProject.name = 'authorizationserver' include 'Sha..