목록TroubleShooting & 고민 (26)
쌩로그
목록 포스팅 개요 본론 2-1. 환경 변수 지정 2-2. yml에 지정 요약 1. 포스팅 개요 해당 포스팅은 스프링부트에서 yml에 환경변수를 지정하고, 출력 테스트를 진행할 때 @Value 애너테이션의 동작에 대한 간단한 개요를 정리하려고 한다. 2. 본론 스프링 시큐리티를 통해 JWT를 적용하려고 하다가. yml에서 환경변수의 값을 지정하고, 출력 테스트를 하려고 할 때 null이 출력 됨을 확인했다. 2-1. 환경 변수 지정 먼저 값을 지정하려면, 윈도우 기준으로 시작 - '환경 변수'를 검색하면 시스템 시스템 환경 변수 편집이 나온다. 거기서 환경 변수 - 시스템 변수 - 새로 만들기 를 통해서 다음과 같이 변수 이름과 값을 넣으면 된다. 리눅스로 편하게 지정하려면 다음 명령어를 사..
인텔리제이 2023-03 버전부터 Presentation Assistant가 내장되었다. (인텔리제이만 그런런지 JetBrain의 모든 툴이 그런지는 모르겠다. 일단 인텔리제이를 한정해서 얘기한다.) 현재 일자(12월13일)부터 인텔리제이 라이센스에 당장 학생메일을 사용할 수 없어서 (대학 다니던 사촌동생이 졸업해서 그런지 인증이 안된다.) 무료 30일을 사용할 수 있는 평가판을 새로 다운로드 받아 사용중인데 인텔리제이를 쓰는 대부분의 사용자가 단축키가 출력되는 Presentation Assistant 플러그인을 사용할 것이다. (단축키 사용시 연두색으로 리눅스, 맥OS, 윈도우의 단축키 알려주는 그것이다.) 나도 이를 사용하려고 알아보던 중이었다. 대부분의 블로그 포스팅을 보면 인텔리제이의 플러그인에서..
목록 포스팅 개요 본론 1. 데이터 형식 2. JSON 3. 또 JSON 요약 1. 포스팅 개요 비질란테의 유지태가 말합니다. "이제부터 내가 너한테 반말을 하겠습니다." 그냥 평소완 다르게 반말로 쓴다는 의미입니다. 현재 프로덕트를 개발 및 구현하는데 있어서 바보같았거나, 인지를 해야되는 부분에 대해서 써보려고 한다. 2. 본론 1. 데이터 형식 데이터 형식은 다양하다만, 일단 현재 사용한 형식은 DataForm, JSON 둘 뿐이다. 나는 데이터 형식에 대해서 어떻게 알고 있었을까... 생각해보면, 그냥 몰랐다... 단지, "JSON은 JSON이고, DataForm은 DataForm이다." 요정도 였다. 그리고, 얼마 전에 올렸지만, 파일을 받을 때는 FormData로 받아야했다... 근데 내가 이상..
목록 포스팅 개요 본론 요약 1. 포스팅 개요 저번에 검색 조건을 가진 Condition클래스 작성시 바인딩 되지 않던 문제 해결이라는 주제로 포스팅을 했었습니다. 당시 검색조건을 필드로 가지던 클래스로 생성된 인스턴스를 계층별로 넘겨서 Repository 계층에서 받고, 인스턴스의 필드 값을 판별해서 데이터 조회결과를 반환하도록 했었습니다. 당시 그냥 구현에만 신경쓰다가 검색 조건 클래스에 @Setter를 무작정 쓰고, "와~ 됬다!"만 하고 끝냈었습니다. 그런데 @Setter를 쓰면, 객체의 변경 가능성의 여지를 열어두기 때문에, 다른 방법을 찾아봤어야 함에도 불구하고, 되었다고 기분이 좋아서 그냥 그대로 사용했었는데요. 이번에 @Setter를 제거하면서 객체의 변경가능성을 다시 닫고, GET매핑시 ..
목록 포스팅 개요 본론 2-1. N+1 2-2. 그럼 N+1은 과연 왜 발생 하게 된 걸까? 2-3. QueryDSL을 사용하므로 얻게 된 효과 요약 1. 포스팅 개요 저번에 N+1 문제가 터져서 QueryDSL을 해결했다고 했는데 자세히 들여다보니 N+1이 근본적으로 해결된 건 아니었다. 오히려 나의 無知(없을 무, 알 지)만 드러낸 포스팅이었다. 그래서 해당 포스팅은 살며시 삭제를 해줬다. 하지만, 나의 마크다운 폴더에는 남아있다... 그거도 나름 공들여서 쓴거라.. 이번에 나의 오점을 제대로 짚어보고자 해당 포스팅을 하게되었다. 2. 본론 2-1. N+1 연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데..
목록 포스팅 개요 본론 2-1. 문제 발생 2-2. 문제 해결 방향 2-3. 문제 해결 요약 1. 포스팅 개요 PostDto로 LocalDate를 받을 때 다음과 같은 코드로 (비슷하게) 작성되어있다. @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate localDate;Spring Rest Docs를 이용해서 API문서를 작성하려고 하는데, Gson 라이브러리의 Gson객체로 toJson()메서드를 이용해서 자바코드로 생성된 클래스를 JSON으로 파싱했다. JSON으로 변환한 데이터는 API 문서에 정보를 넣어줄 때 다음과 같이 content에 넣는다. 이 때 PostDto를 생성할 때 LocalDate 값을 넣어주는데, 그냥 생성자 혹은 빌더패턴을 사용하더..
목록 포스팅 개요 본론 2-1. 구성 클래스 2-2. 문제 살펴보기 2-3. 문제 해결하기 2-3-1. 번외 @Getter 사용해보기 2-3-2. @Setter로 진짜 문제 해결하기 요약 1. 포스팅 개요 이번 프로젝트에서 동행 도메인 같은 경우, 쿼리스트링으로, 지역과 날짜(동행시작 날짜)를 검색해서 조회하는 기능을 구현했는데, 쿼리스트링으로 검색 조건을 넣더라도, 검색조건을 가지는 클래스(AccompanySearchCondition)의 필드와 바인딩 되지 않던 문제를 해결하는 포스팅이다. 결론부터 말하자면 @Setter를 쓰면 된다. 2. 본론 2-1. 구성 클래스 먼저 관련된 클래스 코드를 보면 다음과 같다. Controller // 동행 전체 조회(날짜, 지역) @GetMapping public ..
목록 포스팅 개요 본론 2-1. 일단 결론 2-2. 애플리케이션 로직 2-3. 문제 발생 2-4. 문제 해결 방향 2-5. 문제 해결 요약 1. 포스팅 개요 Entity 클래스에 @Builder 애너테이션을 클래스 레벨에 두었었는데, 클래스에 new ArrayList();를 다음과 같이 선언했음에도 불구하고, NullPointerException(이하 NPE)이 발생했다. 이를 해결한 포스팅이다. @OneToMany(cascade = CascadeType.ALL, mappedBy = "accompany", orphanRemoval = true) List 땡땡List = new ArrayList();예전에 봤던 글에서 @Builder를 주의해서 쓰자고 봤는데,,, 흠.. 이번에 마주쳤다. 2. 본론 2-1..
목차 포스팅 개요 본론 2-1. 문제가 무엇인가? 2-2. 문제 해결 2-3. 해결 결과 요약 1. 포스팅 개요 AOP로 AccessToken 검증(빡쳐서 만듬)이라는 제목으로 포스팅을 했다. AccessToken을 검증하는데 코드상으론 400대 에러를 던지도록 해야하는데, 왠지 모르게 500번대 에러를 던졌다. 이걸 AOP로 해결했었는데, 물론 구현한 부분에서는 나름 괜찮았다고 생각하지만, 사실 AOP를 사용할 필요가 없었고, 또 한 분은 감사하게도 댓글로 알려주시길.. 라고 남겨주셨다. 말씀하신 것처럼 AOP의 목적에 맞게 쓰이지 않았다. 이를 수정하고, 무엇이 문제였는지에 대한 포스팅이다. 2. 본론 2-1. 문제가 무엇인가? 먼저 당시 왜 500번대 에러가 발생했는지를 살펴보자. 먼저 Securi..
목록 포스팅 개요 본론 요약 1. 포스팅 개요 AccessToken을 검증하는데 코드상으론 400대 에러를 던지게 해놨지만, Spring Security 설정 때문인지 내부적으로 500대 에러를 내보낸다. 그래서 살짝 빡쳤다... 계속 살펴보고 살펴보다가 생각해낸 것이 AOP였고, AOP를 이용해서 AccessToken에 대한 검증을 하게 되었다. 지금은 잘 나온다. 토큰 만료시("Token is expired") 토큰 일부러 이상하게 준 뒤 결과("Token is INVALID") 2. 본론 2-1. 발생한 문제 현재 JWT 관리를 어떻게 해야할지 고민 중이다. Redis를 이용해서 AccessToken이 만료될 때 어떻게 해야할지, 로그아웃 처리는 어떻게 해야할지 고민중이었다. 고민을 해결해나가기 위..