no image
[Spring] RestTemplate 과 MessageConverter 순서의 관계
회사에서 내가 만들어둔 라이브러리를 다른 팀에서 사용하고 있는 경우가 있었는데, 어느 날 갑자기 다른 팀에서 아래와 같은 메세지가 나타난다고 확인 요청이 왔다. java.lang.IllegalStateException: org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request: "{"errors":["failed to parse JSON input: invalid character '\u003c' looking for beginning of value"]}" 이게 갑자기 나타날리가 없어서 어떤 작업을 한 후에 나타났냐고 물으니, build.gradle 에 아래와 같은 의존성을 추가하면 위와 같은 에러가 나타난다고..
2023.02.05
no image
[회고] Graylog 에서 ELK 까지의 작업 후기
사내에 로그가 남겨지고 있는 서비스들이 대부분 파일로 관리되고 있는 것이 많았는데 그 중에서 많은 트래픽이 오는 두 개의 서비스 로그 지표를 확인해보고 싶었다. 기존에는 정작 애플리케이션 단위에서 얼마나 요청이 들어오고 나가는지, 어떤 데이터가 얼마나 들어오는지를 개발팀에서 알 수 있는 방법이 없어 실제로 장애 상황이 일어났을 때도 연관 데이터를 쉽게 분석하기 어려웠다. 또한, 로그가 파일로 남겨지고 있어서 SE 분들이 로그를 삭제해도 되는지에 대한 문의가 우리팀에게 간헐적으로 전달되었고, 우리가 직접 서버로 들어가서 삭제하거나 SE 분들이 삭제하곤 했다. 이런 이슈를 이번에 따로 개선해보고 싶었다. 팀에서 해당 서비스의 로그는 오랫동안 보관하기에는 중요하지 않은 로그라고 판단했고, 주기는 1~3개월 정..
2023.02.05
[회고] 2022년
이번 년도는 작년에 들어온 팀원과 함께 특히 리팩토링 작업을 많이 진행했다. 기존에 작성된 Spring Boot 프로젝트를 좀 더 객체지향적이고 유지보수하기 편한 코드로 개선해보자는 것에 초점을 맞추고 진행했는데, 이 과정에서 책도 찾아보고 코드리뷰에서도 깨닫고 이전보다 많이 배운 것 같은 느낌이 들어 보람을 많이 느낀 해였다. 기존 프로젝트에 헥사고날 아키텍쳐를 도입했는데 외부, 내부 요소를 구분하기 쉬웠고 인터페이스 분리나 테스트 코드 작성 면에서 이용하기가 좋아보여서 장기적으로 헥사고날 아키텍처 설계로 개발하기로 정했다. 그리고 객관적으로 보았을 때 기존에 오래 계신 팀원분들은 아무래도 PHP에 익숙한 분들이라 Spring Boot 와 관련한 코드리뷰를 함께 진행하면 아무래도 한계가 있었다. 올해에..
2023.01.01
no image
[Spring] ConversionService 활용해보기
배경 회사에서 100개가 넘는 컬럼들을 다루어야 하는 경우가 있었다. 100개가 넘는 컬럼들 중 섹션별로 일부의 데이터를 추가하거나 수정할 수 있어야 했고, 기존의 데이터와 서로 다른지 판단할 수 있어야 하며 이를 로그로도 남겨야 하는 요구사항이 있었다. 예를 들면 Entity 가 아래와 같은데, @ExampleSection 이라는 Annotation 으로 섹션을 분리한 뒤 사용자가 원하는 Section 별로 데이터를 저장하거나 수정할 수 있어야 하는 것이다. @Entity(name = "exampleEntity") @Table(name = "EXAMPLE_ENTITY", schema = "GREATSCHEMA") @DynamicInsert @DynamicUpdate @Builder @Getter @No..
2022.11.21
no image
[Spring] AutoConfiguration 직접 만들어서 라이브러리로 만들어보기
Spring 에서는 상당히 많은 AutoConfiguration 을 제공해주고 있는데, 따로 라이브러리를 만들면서 직접 만들 수도 있다. 테스트로 하나 만들어보자 구성 우선 구조는 아래처럼 잡고 멀티모듈로 구성했다. autoconfigure - Spring Boot 에서 자동으로 AutoConfiguration 이 적용되는 로직 관련 somelogic - 비즈니스 로직 // root - build.gradle buildscript { ext { projectVersion = '1.0.0' projectGroup = 'kr.pe.karsei' springBootVersion = '2.7.5' springDependencyVersion = '1.0.15.RELEASE' } repositories { mave..
2022.11.11
no image
[여행] 베어트리파크에 다녀왔습니다 (22/10/29)
베어트리파크에 다녀왔습니다. 가을 단풍이 막 물들고 있었고 구경가보고 싶어져서 다녀왔습니다. 세종시에 있는 곳인데 돈이 아깝지 않을 정도로 좋습니다. 맞은편에는 레스토랑 건물이 있었는데 양식 위주로 메뉴가 있었습니다. 당일에 결혼식이 있었는데 그곳에서 결혼식도 같이 할 수 있는 곳인 것 같았습니다. 이런 곳에서 하는 것도 나쁘지 않을 것 같아요. 베어트리파크하면 '베어' 답게 '곰' 이 빠질 수 없죠. '곰' 을 볼 수 있습니다.
2022.10.29
no image
[여행] 피나클랜드에 다녀왔습니다 (22/10/15)
피나클랜드에 가보았습니다. 어디 갈까 하다가 가족들이 여기 홍보하는 걸 어디서 본걸 딱 떠올라서 한번 가보게 되었습니다. 수목원이나 식물원, 정원 등의 장소를 가는 것을 좋아해서 들리게 되었습니다. 규모는 꽤 큰 것 같았고 생긴지는 얼마 되지 않아 보였습니다. 주차장은 상당히 커서 무리는 없었지만 그보다는 주차장까지 가는 길목이 상당히 협소했습니다. 약간 경사진 길이 있는데 나중에 돌아갈 때를 생각해보니 앞에 큰차가 뒤로 밀려나게 된다면 큰 사고가 날 수 있을 것 같으므로 여기 부분은 나중에 잘 해결이 되었으면 좋을 것 같네요. 매표소는 주차장 옆에 있는 길을 계속 따라 걸어가다보면 왼쪽에 있습니다. 현장에서도 발권할 수 있고, 인터넷에서도 발권할 수 있습니다. 미리 인터넷 예매를 하고 가면 줄서서 기다..
2022.10.29
[JPA] QueryDSL 에서 오늘 날짜 활용해서 사용하기 (feat. Oracle)
아래와 같은 클래스가 있다. @Entity @Builder @Getter @NoArgsConstructor @AllArgsConstructor public class PremiumPrice { @Id private Long id; @Column private BigDecimal usdPrice; @Column @CreationTimestamp private LocalDateTime registDate; } 만약, 데이터를 찾을 때 registDate 를 기준으로 오늘 이후의 데이터를 찾고 싶으면 어떻게 할까? 여러 가지 방법이 있겠지만 이 글에서는 두 가지 방법을 소개한다. Expressions.dateTemplate Expressions.dateTemplate(LocalDateTime.class, "s..
2022.10.24
no image
[JPA] QueryDSL 에서 문자열을 숫자로 뽑아서 변환하기
Entity 안에서 String 으로 관리되고 있는 값을 다른 DTO 클래스에서 받을 때 BigDecimal 과 같은 데이터 타입으로 받고 싶다면 어떻게 할까? 물론, Entity 안에 있는 필드 데이터 타입과 똑같이 관리되면 좋겠지만 뭔가 크롤러 같은 프로그램에서 어딘가의 가격 데이터를 가져올 때 아래와 같은 데이터들이 포함된다고 해보자. '판매중이지 않음' '1200000' '없음' 만약, 위 데이터 중에서 숫자만 이루어진 것을 뽑아내려면 어떻게 해야 할까? 충분히 있을 수 있는 상황이다. 우선 아래와 같은 클래스가 있다고 하고, renewalPrice 라는 필드 값에 위와 같은 데이터들이 포함된다고 생각해보자 @Builder @Getter @NoArgsConstructor @AllArgsConstr..
2022.10.24