개발 썸네일형 리스트형 [Spring] Security의 인가(Authorization) 실패 시 처리 기존 프로젝트에서 스프링 시큐리티 사용에 있어, 인가 실패 시 스프링이 제공하는 기본 예외를 반환하고 있어, 내가 원하는 Json 형태로의 반환을 위해 추가로 커스텀이 필요했다. 당연히 스프링 시큐리티에서 예외처리 커스텀이 가능한 기능을 지원하고 있다. AccessDeniedHandler 인터페이스를 구현받고 handle 메소드를 재정의 한 후, 시큐리티 설정에 추가해주면 된다. 우선 Jwt와 시큐리티 예외처리를 동일한 형식으로 처리하기 위한 Response Writer 용 static method를 만들었다. public class CommonWriter { private static String convertToJson(Object object) { try { return new ObjectMappe.. 더보기 [Spring] Security와 Jwt 사용을 통한 인증, 인가 도입기 토이 프로젝트를 진행하면서, 초기 설정을 하는데 고생을 많이 했는데, 그 중에서도 특히 Spring Security와 Jwt를 동시에 적용하는 부분이 잘 되지 않았다. 특히 스프링부트 3 이후에 시큐리티 부분 설정도 바뀐부분이 있어서, 기존 구글링 한 검색 결과들에서 조금씩 맞지 않는 부분들도 있었다. (라고 하기에는 충분히 많은 참고 자료들이 있기는 했다..) 1. 의존성 추가 build.gradle 내에 spring security와 jwt 의존성을 추가해준다. //security implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.security:spring-s.. 더보기 [Spring] Bean을 Collection으로 호출하기 최근 실무를 진행하면서 여전히 많이 부족함을 느낀 일이 있었다. 어떻게 보면 여전히 기본기가 부족하다고 할 수 있는 사건. 정책에 따라 생성된 Bean을 Map 컬렉션을 통해 호출하는 코드를 보았는데, 바로 이해하지 못했다. 프로젝트 전역적으로 보아도 해당 Map에 Bean을 put 해주는 코드는 존재하지 않았던 것. 대략적인 코드는 아래와 같은 구조였다. @Service @RequiredArgsConstructor public class MyService { private final Map myBeanMap; private MyBean getMyBean(String beanName) { return myBeanMap.get(beanName); } } MyBean 객체는 상속을 통해 다형성을 활용한 구현.. 더보기 @Embedded, @Embeddable JPA 엔티티를 구성함에 있어, 엔티티를 DB중심적이기 보다는, 객체지향적으로 만들고자 한다면 임베디드 타입을 사용하면 좋다. 임베디드 타입은 코드의 재사용을 가능하게 하고, 응집도를 높여준다. @Embedded : 값 타입을 사용하는 곳에 표시 @Embeddable : 값 타입을 정의하는 곳에 표시 * 기본 생성자 필요 위와 같이 Embeddable 로 설정한 값들을 Entity에 Embedded로 지정해줄 수 있다. 이렇게 되면, 다른 Entity에도 Embedded로 같은 값들로 지정이 가능하게 된다. Entity를 저장할때는 아래와 같이 한다. DB에는 Embeddable 클래스의 변수들이 각각의 값이 컬럼으로 저장된다. 출처 : https://velog.io/@seongwon97/Spring-B.. 더보기 [DB] Entity에 catalog 옵션이 있을 경우 실무 환경에서 설계를 하다보면, DB 스키마가 분리되어 있는 경우가 있다. 특히 JPA를 사용하는 환경에서 스키마가 분리되는 경우는 그다지 권장되지는 않는 듯 하지만, 어쩔수 없는 경우도 있으니까.. @Entity @Table(name = "my_entity", catalog = "second_schema") public class MyEntity {...} 메인 스키마가 있는 경우 다른 스키마에 테이블이 있는 경우 Entity의 Table 어노테이션에 catalog 옵션을 주어 JPA 테이블이 해당 엔티티를 바라보도록 설정할 수 있었다. 문제는 테스트코드 작성시 H2 Database를 사용하고 있었는데, 기본 설정만으로는 해당 테이블을 인식하지 못해 테스트를 통과하지 못하고 있다는 것이다. 이 때 테스.. 더보기 [MySQL] 내가 원하는 순서대로 Order by 조건을 주자 최근 회사에서 FE에서 특정 필드의 순서를 담아 API 요청을 하고, 그 순서대로 json 형태로 return을 해야하는 케이스가 발생했다. 결국 깔끔하게 가져오려면 API에서 조건 반복을 돌리기보다는 DB의 쿼리로 조건을 뽑아내고 싶었다. 하지만 일반적인 경우 order by 조건은 특정 컬럼을 기준으로 오름(내림)차순만 가능했다. 하지만 아래와 같이 'FIELD' 값으로 컬럼을 지정하고 순서를 입력하게 된다면. 내가 원하는 순서대로 조회가 가능했다. SELECT VALUE FROM TABLE ORDER BY FIELD(VALUE, 'val3', 'val1', 'val2'); 하지만, 문제는 DB단에서 처리한다고는 했지만, 실제로는 QueryDSL을 사용하여 조회 쿼리를 수행하고 있었다는 것이다. 이에.. 더보기 [Java] JVM - ClassLoader(아주 얕은 수준) 최근 APM(Application Performance Monitoring) 시스템을 담당하게 되면서, 기존 애플리케이션을 분석하는 과정에 있는데, 그동안 몰랐던 다양한 개념들에 대해 많이 알아가고 있는 중이다. 그리고 그 중에 JVM의 한 영역이 ClassLoader에 대해 간단한 역할 정도만 알고 있었는데, 조금 더 깊게 알아볼 기회가 생겼고, 그 부분에 대해 공부한 점을 정리하고자 한다. 이전에는 클래스로더를 단순히 ".class 파일을 읽어 바이너리 코드로 변환한다" 정도로만 알고 있었다. 클래스로더는 기본적으로 3가지로 구분된다(물론 Java 버전에 따라 조금씩 차이가 있다) Java 8을 기준으로 보면.. BootStrap ClassLoader Extension ClassLoader Appli.. 더보기 [Java]Try-with-resource 최근 자바 기본서 한 권을 마무리하면서, 당연히 기본적인 내용은 다 알 것이라고 생각했던 부분에서 전혀 몰랐던 개념들에 대해 많이 알게 되었다. 그 중 하나가 Try-with-resource이다. Try-with-resource는 Java 7 이후에 추가되었다. 일반적으로 자바에서 자원(리소스)을 사용할 때 Try { } catch { } 구문을 사용하고, 사용한 자원에 대해 close() 메서드 등을 통해 해제하는것이 일반적이다. 하지만 매번 개발자가 번거롭게 선언과 해제를 해주는 부분을 한층 더 편하게 가져가기 위해 Try-with-resource 개념이 도입되었다. 기존의 try-catch 구문은 아래와 같이 사용하였다. 주로 finally 구문을 선언해 리소스를 해제했다 문제는 개발자도 사람인지라.. 더보기 이전 1 2 3 4 5 6 7 ··· 9 다음