전체 글
제네릭 DTO
jwt 토큰 을 추가하는 도중 이미 사용중인 서비스가 사용하고 있는걸 추상화하는 작업중에 제네릭을 사용한 후기이다. 서비스 마다 다른 토큰유지 시간, 페이로드를 갖고 있는데 오버라이딩을 사용하였는데 코드리뷰 때 같은 기능을 하면서 약간의 필드추가만 되는것이라서 제네릭을 사용해보는게 어떻냐는 피드백을 받았다. 물론 처음 써보는거라서 시간이 오래 걸렸다. 재미있었고 신세계였다 (제대로 쓴것도 아니지만) 아래와 같이 제네릭 클래스를 생성하고 issue (토큰발행) 을 실행했을 때 제네릭 타입으로 생성 하였다 @Data @AllArgsConstructor public class TokenPayload { private T tokenPayload; public T getTokenPayload() { return ..
화면에 원하는 에러메시지 보내기
간단한 기본 등록 페이지라서 다른코드와 똑같이 하다가 약간 변화를 주었다. html 에서 ajax로 서버에게 요청할때 success 즉 통신에 성공하고 java 에서 return 으로 ok (boolean) 을 내려주면 message 를 띄어준다. const updateDriver = function () { if (confirm("등록하시겠습니까?")) { $.ajax({ type: "POST", url: "/create", data: $("#createForm").serialize(), dataType: 'json', success: function (r) { alert(r.message); if (r.OK) { location.href = '/list'; } }, error: function (xh..
블로그
요즘 취미가 많이 생긴것 같다.(등산, 캠핑, 펌프 등..) 네이버 블로그나 영상을 찍어 올릴까 생각중인데 또 시작하려면 각잡고... 해야 하기 때문에 생각할 시간이 필요하다. 생각할 시간동안 코틀린 공부를 시작해보려고 코틀린 + spring 으로 블로그를 만들 생각이다. 전부 안쓰고 못쓰던 기술을 찾아서 삽질할 예정. 우선 팀장님이 추천해주신 1. CI/CD 적용 + 테스트 코드 작성 2. ECS 서버 (를 위해 +Docker) 3. Spring Webflux 프레임워크 (Coroutine) 4. 캐시서버 (redis) 블로그에서 사용하기엔 과하다고 생각할 수 있지만 공부용으로...모두 적용할 예정이다 긴 싸움이 예상된다 ^^...
SpringBoot - kotlin 프로젝트 세팅하기
코틀린 공부를 시작하려고 SpringBoot - kotlin 프로젝트를 세팅 하는 과정입니다 공식문서 참고 하시면 도움이 될것 같습니다 https://spring.io/guides/tutorials/spring-boot-kotlin/ 1. 프로젝트 생성 위와 같이 세팅하는데 스프링부트 버전이 마음에 걸렸다. 인텔리제이에서 사용가능한 버전으로 자동 세팅해준것 같지만 의심스러운 마음에 공식홈페이지에 들어가 확인했다. https://spring.io/projects/spring-boot#support 아래로 스크롤을 내리면 색깔의 의미를 확인할 수 있다. 우선 특별히 어떤 플러그인을 사용할지 생각해둔게 없기 때문에 프로젝트 생성시 설정되어있는 3.0.4 로 프로젝트를 세팅한다. Incompatible beca..
12월 회고
추가되는것도 수정할것도 많아 끝나지 않을것 같던 프로젝트가 마무리되어 간다. 중간중간 같이 개발하던 개발자분이 다른 프로젝트에 도움이 필요해 혼자 개발을 해야 했던 기간이 있었다. 기간안에 끝내지 못할까봐 너무 불안했다. (그만큼 너무 의지하려고 했었다는걸 깨달았다 😔) 어드민 페이지인만큼 보통 API 개발보다 훨씬 복잡하고 오래걸렸는데 실수해서 다시 원복했던 부분들도 많았다.(기획적으로) 매니저님께서 중간중간 피드백과 확인을 해주셔서 너무 큰 도움이 되어서 다행이지만(또 혼자했으면 정말 좌절했을것 같다...) 상태변화에 대한 유효성 검사 하기 state machine 을 알려주셔서 검색하여 아이패드로 비슷하게 작성했다. 주문상태에 따른 변화가 복잡하게 되어있어서 이해하는데 많은 시간이 걸렸다. 이미 존..
No property found for type ! (Querydsl)
하 내 시간.... No property xxxx found for type xxx 기존에 있던 repository 에서 추가적으로 querydsl 을 사용하려고 custom interface 와 impl class 를 생성했다 계속해서 스프링이 빈을 못찾아서 구글링 해보고 메서드 이름도 바꾸며 여러가지 시도하다가 다음 블로그글을 발견했다. https://www.skyer9.pe.kr/wordpress/?p=6507 QueryDSL No property 메소드명 found for type 엔터티명! – 상구리의 기술 블로그 QueryDSL No property 메소드명 found for type 엔터티명! 클래스명 xxxRepository xxxRepositoryCustom xxxRepositoryImp..
11월 회고
개발자로 취업하여 2년이라는 시간이 지났다. 어떤 프로젝트를 했고 뭘 했고를 쓰지는 못할 것 같다. 내가 뭘 할 수 있고 했는지 기억이 안난다... 앞으로 꾸준하게 기록이나 회고를 해야 할 것 같아 달마다 회고를 쓰기로 했다. 개발자로서의 성장 개선해야할 점 조급함: 개발을 시작했을 때와 비교했을 때 많이 성장했지만 역시 세상에는 엄청난 사람이 너무 많다 조급해하지 않도록 노력하자 휴식: 휴식할 때는 일 생각을 하지 말자 비교: 속도가 느린거지 멈춰있다고 생각한 적은 없으니까 비교하지 않도록 노력하자 약속: 일정을 맞추기가 너무 어렵다 공부: 자꾸 핑계대면서 안하게 된다. 지금 하던 거 라도 마무리해보자 잘했던 점 아직 포기하지 않았다 사실 내가 개발에 유리한 성격은 아니다. 논리적인 부분에서 약하고 쉽..
Hibernate 에서 제공하는 @NotNull & @NotEmpty & @NotBlank 사용하기
Hibernate 가 뭐지? 하이버네이트 ORM은 자바 언어를 위한 객체 관계 매핑 프레임워크이다. 객체 지향 도메인 모델을 관계형 데이터베이스로 매핑하기 위한 프레임워크를 제공한다. JPA의 구현체의 한 종류로, JPA 인터페이스를 구현하며 내부적으로 JDBC API 를 사용한다. Hibernate 는 SQL 을 직접 사용하지 않고 메서드 호출만으로 쿼리를 수행합니다. ( SQL 반복작업을 하지 않아도 된다 ) 컬럼이 변경되었을 때, 테이블과 관련된 DAO 의 파라미터, 쿼리 ,SQL 등을 대신 수행해주기 때문에 특정 벤더사에 종속적이지 않습니다. 이러한 특징은 유지보수 측면에서도 큰 장점입니다. 예를 들어 Mysql 을 사용하다가 ORCLE 로 변경하더라도 Hibernate 는 변경한 ORCLE 로 ..
나만 어려운 예외처리
개발 하면서 당연한 부분이였지만 나에겐 새롭게 다가왔던 예외처리 ... ㅜ 리뷰 해주시는 매니저님이 너무 잘 알려주셔서 정리 해봅니다 ( 격한 감사 🥹 ) 소제목이 연관되어 이어지지는 않고 상황마다 예외처리 했던 부분을 메모했습니다. 예외 발생 시 조치를 못하는 경우 & 관리하지 못하는 경우 POINT * 발생할만 곳 에서 catch 후 메시지를 적는다. (예외상황을 정확히 서술한다) * 언체크예외로 변경한다. 예외를 잡지 못하면 자바에서는 해당 정보를 자동으로 출력합니다. 하지만 실패원인을 분석할 때 볼 수 있는 정보는 스택정보일 경우가 많기 때문에 log 로 예외를 관리하고 있다면 실패 원인에 관한 정보를 가능한 많이 담아 반환하여 추적하기 쉽도록 하는게 중요합니다! 1. 발생한 예외에 대한 모든 값..
Enum Type 에서 Function Interface 활용
회사 코드를 분석하다가 함수형인터페이스를 활용한 부분이 있어서 공부해보았다. 사용한 목적은 해당 EnumType 을 사용하면 그 Enum에 맞게 배열을 정렬했습니다. 신선한 충격을 받았습니다 ..ㅎ.. 그래서 저도 간단하게 구현해보고 공부해봤습니다! package com.example.demo; import java.util.function.Function; import lombok.Getter; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor public enum ItemType { AA("생수",CalRatio::getRatio), BB("음료",CalRatio::getRatio), CC("과자",CalRatio::get..
Interceptor 활용하기 ( feat . ArgumentResolver, Custom Annotation )
동기분의 도움으로 처음으로 Interceptor 를 적용해보아서 나중에 사용할 일이 있을 때 찾아보려고 써봅니다! 아래와 같은 Controller 에 Header 에서 인증을 위한 값을 받아야지만 접근할 수 있도록 설정하겠습니다! @RestController @RequestMapping("/orders") @RequiredArgsConstructor public class OrdersController { private final OrdersService ordersService; @Auth(type = ApiServiceType.HOMEPAGE) @GetMapping public ResponseEntity getOrders( @RequestParam(required = false) String sear..
Test-Driven-Development 테스트 주도 개발
TDD 개발 방식 TDD 는 테스트 코드를 작성한 뒤에 실제 코드를 작성하는 것이다. 테스트가 통과된 코드만을 실제 코드로 작성한다 -> 버그가 줄고 소스가 간결해지며 설계가 개선된다. - 설계 단계에서 프로그래밍 목적을 미리 정의한다. - 무엇을 테스트해야 할지 미리 정의한다. - 테스트 코드 작성 도중 발생하는 예외 사항을 테스트 케이스에 추가한다. (설계 개선) TDD 프로세스 실패하는 작은 단위 테스트 추가 -> 테스트 통과, 최소한의 코딩 -> 구현 설계 개선, 중복 제거, 리팩토링 , 테스트 통과 유지 좋은 테스트의 특징 Fast: 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다. Independent: 각각의 테스트는 독립적이며 서로 의존해서는 안된다. Repeatable: 어느 환경에서..