본문 바로가기

Spring Boot

Querydsl 에서 Order By 구문에 조건문이 있을 시 생기는 오류 처리 (unexpected AST node) 안녕하세요 유저인사이트 박준호 선임입니다. 상품들의 별도의 정렬 기준이 있는 상태에서, 재고가 0 인 상품은 하단에 몰리도록 처리하는 부분에 문제가 생겼습니다. final JPQLQuery query = from(product).where(builder).orderBy(product.stock.eq(0).asc()) .leftJoin(plant).on(product.plant.eq(plant)) .leftJoin(pot).on(product.pot.eq(pot)) .groupBy(product.pot.potGroup, product.plant.plantGroup); :7:24: unexpected AST node: = 혹시나 문법 오류가 있는지 확인하기 위해 Sql로 테스트 해봤는데, 문제가 없었습니다...
IntelliJ에 SonarQube 연동하기 (SonarLint) 안녕하세요. 유저인사이트 박태양입니다. 이번 시간에는 IntelliJ에 정적 분석 도구인 SonarQube를 연동하는 방법을 알아보도록 하겠습니다. 순서는 아래와 같이 진행됩니다. 1. 소나큐브 설치 및 키 발급 2. IntelliJ에 SonarLint 플러그인 설치 후 연동 우선 아래 링크를 통해 소나큐브를 다운로드 합니다. https://www.sonarsource.com/products/sonarqube/downloads/ Download | SonarQube Get the latest LTS and version of SonarQube the leading product for Code Quality and Security from the official download page. www.sona..
랜덤한 IV(Initial Vector)를 사용하여 AES256 암호화, 복호화 하기 안녕하세요 유저인사이트 박태양입니다. 프로젝트를 진행하다 보면, 개인정보와 같은 암호화가 필요한 필드들이 있습니다. AES256 관련된 코드를 구글링 해보면 대부분의 블로그에서 IV값을 고정값으로 사용하고 있습니다. 이는 권장되지 않는 방식입니다. 저희는 소나큐브를 통해 아래와 같은 메시지를 확인할 수 있었습니다. Use a dynamically-generated, random IV 왜 문제가 되는것일까요? IV를 고정된 값으로 처리하면, 입력한 값이 동일한 경우 동일한 암호화 결과를 제공합니다. 예를들면 "박태양"이라는 문자열을 암호화할때 1회차 : $2a$12$lYImjNoPVvNn30O 2회차 : $2a$12$lYImjNoPVvNn30O IV를 랜덤한 값으로 처리하면 아래와 같이 결과가 미세하게 달..
MariaDB Trigger 추가할 때 SQL syntax 에러 해결 Spring Boot 에서 .sql 파일로 Trigger를 추가하는데 문제가 발생했습니다. 아래는 발생했던 Trigger 추가 예시입니다. DROP TRIGGER IF EXISTS {트리거명}; DELIMITER | CREATE TRIGGER {트리거명} AFTER INSERT ON {테이블} FOR EACH ROW BEGIN UPDATE {대상테이블} SET {A} = {B} WHERE {C} = {D}; END; | DELIMITER ; Trigger 문에서 세미콜론을 사용하기 위해 미리 구분자를 | 로 변경 하고, 구문을 마무리 한 후 다시 구분자를 세미콜론으로 지정했습니다. 그런 후 테스트를 위해 추가하려는데 You have an error in your SQL syntax; check the m..
[Java] 모두 null 인지, null이 하나라도 존재하는 지 체크 (ObjectUtils) Apache commons 라이브러리에는 우리가 필요로 하는 훌륭한 유틸들이 존재합니다. 이 중 null체크를 보다 간결하게 할 수 있도록 도와주는 ObjectUtils를 소개합니다. Dependency가 없는 분들은 먼저 아래 링크를 통해 추가해주세요. https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 1. 모두 null 인지 체크 ObjectUtils.allNull(a, b, c, ...); ObjectUtils.allNotNull(a, b, c, ...) 2. null이 하나라도 존재하는 지 체크 ObjectUtils.anyNull(a, b, c, ...); ObjectUtils.anyNotNull(a, b, c, ...); 지..
[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 Security에서 제공하는 자동로그인 기능입니다. 하지만 Multi Tenancy 환경에서 User 데이터를 Tenant 별로 관리하고 있다면 자동 로그인 기능이 작동하지 않는 현상이 발생합니다. 이를 해결하기 위해 RememberMeService를 직접 구현해 Bean 등록을 해줘야 하고, Remember-Me 토큰을 DB에 저장해 직접 관리해야 합니다. 메커니즘 최고관리자 Tenant에 Remember-Me 토큰을 저장 해야하고 동시에 User의 Tenant 정보도 저장합니다. User가 재방문 했을 때 DB에 저장된 Tenant로 변경 후에 User를 찾아줘야 합니다. PersistentLogins 도메인 생성 CREATE TABLE IF NOT EXIST..
[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..