Spring 8

[Spring] SimpleDateFormat 사용 시 NumberFormatException 발생 원인

워치 데이터를 서버 DB에 저장하는 API 에서 java.lang.NumberFormatException: multiple points 에러가 발생했다. 문자열로 들어온 데이터를 원하는 날짜 형식에 맞게 저장하는 로직에서 parse 과정을 여러번 반복해야했고, 때문에 static 변수로 SimpleDateFormat 을 사용하고 있었는데, 해당 로직에서 발생한 에러였다. 로그를 열어보니 잘못들어온 데이터가 전혀 없었고 validate 이후에 parse 되기 때문에 이유를 전혀 알수 없었지만, SimpleDateFormat을 static 으로 선언하면 parse 로직에서 간헐적으로 발생한다고 한다.이런...(해당 API 는 parse 과정을 여러번 반복해서 진행하기 때문에 발생한것 같다.) 아래 블로그를 ..

Spring 2023.11.17

[Spring] 클래스명 동일할 경우 swagger 에서 구분 못하는 이슈 해결

Title Spring 에서 swagger를 사용할 경우 프로젝트 내에 클래스 명이 동일한 Class 가 2개이상 존재한다면 Example Value를 제대로 불러오지 못하는 이슈가 발생함. Text swagger에서 클래스들을 분리할때 기본적으로 패키지를 포함하지 않고 관리하기 때문에 클래스 명이 동일할경우 Example Value 및 Schema 를 제대로 불러오지 못하게 됩니다.(에러가 발생하지 않기 때문에 당황스러울 수 있음..) 해결 방법은 swagger 가 클래스를 분리할 수 있도록 패키지명을 포함한 클래스명을 인식하게 해주면 됩니다. 아래 코드를 properties 에 추가해주면 됩니다. springdoc.use-fqn=true Conclusion swagger 는 백앤드 개발자의 중요한 기..

Spring 2023.09.15

[Spring] Servlet Filter 사용하기

Title Filter 는 애플리케이션의 여러 로직에서 공통 관심사 이슈를 처리하는 방법중 1가지 방법입니다. 스프링의 AOP로도 해결할 수 있지만 웹과 관련된 공통관심사는 서블릿 필터 또는 인터셉터를 사용하는 것이 좋습니다. Text 왜일까요? 답은 애플리케이션이 Http요청에 응답하는 순서(Filter → Interceptor → AOP → Interceptor → Filter ) 에 있습니다. Filter는 Http요청에서 가장 첫번째 요청이기 때문에스프링과 무관한 자원에 대해 동작하고 있습니다. 따라서, Filter 는 스프링과 분리되어야 하는 작업이나 모든 요청에 대한 로깅 등에 사용되고, Interceptor 는 모든 빈에 접근이 가능하기 때문에 controller에 넘겨주는 데이터의 가공등의..

Spring 2023.05.29

[Spring] AOP (Aspect-Oriented Programming) 란? AOP로 로깅하기

Title 실무에서 작업중에 aop를 사용해서 logging과 token 인증 작업하고 있는 프로젝트들이 있습니다. aop가 무엇인지 알아보고 사용하고 싶어서 정리해보겠습니다! Text 먼저 aop는 (AspectOrientedProgramming) 의 약자로 관점 지향 프로그래밍 이라고 합니다. 간략하게 주요관점과 부가적인관점으로 프로그래밍을 나누어서 모듈화하는 작업입니다. aop의 주요 개념을 이해하고 예제 코드를 통해 AOP에 대해 간략하게 알아보겠습니다. AOP의 주요개념 - 출처 : https://engkimbs.tistory.com/746 Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함. Target : Aspect를 적용하는 곳 (클래스, 메서드 .. ..

Spring 2023.04.12

[Spring] @Valid 를 이용한 @RequestBody 객체 검증하기

Title SpringBoot - > @Valid 를 이용한 @RequestBody 객체 검증하기 Issue RestController에서 Request DTO의 데이터를 검증하기 위해 검증하고 자하는 body의 @RequestBody 앞에 @Valid을 붙여준다. → Service 단이 아닌 컨트롤러 단 진입 Request DTO 에서 NULL체크 및 유효성 검증을 할수 있다. implementation 'org.springframework.boot:spring-boot-starter-validation' @Valid 어노테이션 종류 : @Vaild annotation Type Link @Vaild 를 사용할 때는 검증하고자 하는 DTO 각 객체의 형식에 알맞는 annotation 을 사용해야한다. R..

Spring 2023.03.27

[Spring] @Builder + @NoArgsConstructor 사용 시 발생하는 이슈

Title @Buillder 와 @NoArgsConstructor를 같이 사용하지 못하는 이유에 대한 글입니다. Issue API Controller Request DTO를 생성하던 중 @Builder를 사용하려고 했으나, @NoArgsConstructor와 함께 사용하면 에러가 나는 이슈가 발생했습니다. Why 먼저 @Builder를 사용하는 이유를 파악해야합니다. Lombok에서 제공하는 @Builder 어노테이션은 매개변수가 많을 때 좀 더 편리하게 객체를 만들 수 있게 도와주는 것입니다. Build 되는 매개변수를 Build 하기위한 전체 생성자가 필요합니다. @Builder 는 기본적으로 전체생성자 및 빌더 관련 메소드들을 만들어주고 있는데, 클래스 자체에 붙는 @Builder 어노테이션은 해당..

Spring 2023.03.27

[Spring] 실무에서 Logger를 사용하는 이유

Spring 김영한 님 강의를 듣다 보면 지금은 공부하는 중이라 System.out.print(이하 sout)으로 콘솔로그를 찍는다고 말씀하시는 것을 자주 들을 수 있다. 실무에서는 sout 대신 logger를 사용한다고 말씀하시는데 실제 개발자가 되어 보니 sout 으로 로그를 찍지 않는다. 그 이유는 뭘까? 친절하게도 mvc1 강의에서 로깅관련 강의를 1강 추가해주셨다. 주니어 개발자 관점에서 System.out.print 를 사용하지 않고 logger 를 사용한 이유를 알아보자 로그 선언 로그를 사용하기 위해서는 아래와 같이 선언한다. private final Logger log = LoggerFactory.getLogger(getClass()); // 또는 @Slf4j : //롬복 사용 가능 로그..

Spring 2023.02.05

[Spring ] UUID, PK 로 사용하기

💡 UUID의 사용 방법 먼저 UUID를 생성한다. UUID는 MySQL에서 정렬할 수 없기 때문에 PK로 사용하기 위해서는 재조합(UUID 순서의 재조합)을 위해 데이터를 수정한 후 DB에 넣는다. DB에 UUID가 저장될때는 binary 형식으로 저장된다.(저장공간의 효율성을 위해) DB에서 UUID를 조회할때는 HEX 형식으로 바꿔서 조회해야한다. → 그렇지 않으면 HEX화 되지 않은 binary의 값을 나타내게 된다. (DB 툴에 따라 binary형식이 표현되는 형식이 다를 수 있다. ) HEX 형식으로 조회한 UUID 를 WHERE 조건등에 사용하기 위해서는 UNHEX를 사용해서 binary 타입으로 변경해야한다. query 예시 SELECT HEX(PK) from extable SELECT *..

Spring 2023.01.30