본문 바로가기

Spring Boot

[JPA] Entity Column에 Map 사용하기 public class UserImageManage { @Id @EqualsAndHashCode.Include private Integer id; ... @Fetch(FetchMode.SELECT) @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "user_image_mapping", joinColumns = @JoinColumn(name = "user_image_manage_id", referencedColumnName = "id")) @MapKeyColumn(name = "user") @Column(name = "image") private Map userImageMap = new HashMap(); ... } @MapKeyCo..
[Spring Security] Multi Tenancy 환경에 Remember Me 적용하기 Remember-Me 기능은 Spring Scurity에서 제공하는 자동로그인 기능입니다. 하지만 Multi Tenancy 환경에서 User 데이터를 Tenant 별로 관리하고 있다면 자동로그인 기능이 작동하지 않는 현상이 발생합니다. 이를 해결하기 위해 RememberMeService를 직접 구현해 Bean 등록을 해줘야 하고, Remember-Me 토큰을 DB에 저장해 직접 관리해야 합니다. 메커니즘 최고관리자 Tenant에 Remember-Me 토큰을 저장 해야하고 동시에 User의 Tenant 정보도 저장합니다. User가 재방문 했을 때 DB에 저장된 Tenant로 변경 후에 User를 찾아줘야 합니다. PersistentLogins 도메인 생성 CREATE TABLE IF NOT EXISTS ..
[Spring Security] Run-As로 임시 권한 부여하기 Spring Security에는 Run-As라는 임시 권한을 부여하는 기능이 있습니다. 이 기능을 통해 User에게 임시적으로 특정 권한을 부여해 여러 가지 작업을 할 수 있게 해 줍니다. 임시로 부여한 권한은 일시적으로 부여되는 휘발성 권한이므로 계속 유지되지 않습니다. RunAsManager @Configuration @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) public class RunAsConfig extends GlobalMethodSecurityConfiguration { @Override protected RunAsManager runAsManager() { RunAsManagerImpl runAsMa..
hikariCP 커넥션 누수 탐지 및 QueryDsl의 transform 커넥션 누수 이슈 해결 문제 발견 개발을 진행하던 도중 간헐적으로 아래와 같은 타임아웃 오류가 발생하며 서버가 먹통이 되는 경우 발생함 hikari-pool-1 – Connection is not available, request timed out 원인 분석 사용가능한 커넥션이 없는 것으로 보이는데 현재 커넥션풀 사이즈를 20으로 세팅하였고, 커넥션이 모자라서 데드락이 걸릴 상황도 아님 우선 실제로 커넥션풀의 20개 커넥션이 모두 사용되는지 확인하기 위해 hikari 로그 출력 설정을 추가함 logging: level: com.zaxxer.hikari.HikariConfig: DEBUG com.zaxxer.hikari: TRACE 추가 후 실행하여 사이트 여기저기 돌아다니다 보니 아래와 같이 커넥션 풀의 idle 커넥션이 0으..
[Spring Boot] Optional의 orElse(), orElseGet() 알고 쓰기 Optional은 null-safe 한 코드를 작성할 때 주로 이용됩니다. 데이터를 받아왔을 때 null 일 경우 orElse(), orElseGet()을 사용해 처리를 하는데 둘에 작지만 큰 차이점이 있으니 꼭 알고 써야 합니다. isPresent() - get() 형식도 있지만 가시성 좋고 간결한 코드를 사용합시다. 요약 1. orElse()는 Optional의 값과 상관없이 항상 메소드를 실행한다. 2. orElseGet() 은 Optional이 null 일 때 메소드가 실행된다. orElse() vs orElseGet() public T orElse(T other) { return value != null ? value : other; } public T orElseGet(Supplier
[Spring Boot] WebSecurityConfigurerAdapter Deprecated 대처 스프링 시큐리티 5.7 부터 WebSecurityConfigurerAdapter가 Deprecated 되었습니다. 기존 @Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeHttpRequests((authz) -> authz .anyRequest().authenticated() ) .httpBasic(withDefaults()); } } 변경 (필터체인 빈 등록) @Configuration public class SecurityConfigura..
[튜토리얼] IntelliJ로 CRUD 구현하기 헬로월드가 실습생이 프레임워크를 알고있는지 체크하는 항목이였다면, CRUD는 프레임워크를 정말 쓸줄 아는지 확인할 수 있는 방법이라고 생각합니다. 기본적인 프로젝트 세팅은 앞선 글 (https://userinsight.tistory.com/19)을 참고해주세요. org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 pom.xml에 의존성을 추가해줍니다. (간단한 구현을 위해 h2 데이터베이스를 사용합니다) package com.example.springboottutorial; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax...
[튜토리얼] IntelliJ로 Hello World 찍기 저희 회사는 매년 현장 실습생들이 거쳐갑니다. Spring Boot 경험 여부를 묻기 위해 가장 먼저 하는 질문은 "헬로월드 찍을줄 아니?" 저 역시도 QA일을 하다가, 개발자 이직을 준비할때 가장 먼저 찾아보았던 것이 Hello World 였습니다. IntelliJ에서 좋은 예제를 제공하고 있는데, 이를 모르고 블로그를 참고했던 기억이 있습니다. 저희 회사에 오는 현장 실습생이나, 개발을 처음 시작하시는 분들에게 도움이 되었으면 좋겠습니다. 위 사진처럼 이름, 그룹, 아티팩트, 패키지명 등을 설정해줍니다. JDK가 설치되어 있지 않다면 IntelliJ를 통해서 설치할 수 있습니다. Spring MVC를 사용하기 위해 Spring Web을 선택해줍니다. package com.example.springbo..