Java 객체가 생성과 상태변경을 책임지는 방법 Spring Framework 백엔드 개발업무를 진행하면서 기존에 존재했던 코드들을 확인할 때 가장 힘이 들었던 부분은 객체의 생성과 상태 변경 로직들이 여러 비즈니스 로직에 나뉘어 녹아들어 있을 때였습니다. // 극단적 예시이긴 하지만 홍길동 이름을 가진 Person객체가// checkPerson 메소드에 매개변수로 전달후 name 출력값을 확인하면// 철수라는 이름으로 변경됩니다. 즉 checkPerson메소드에서 상태값을// 변경하는 로직이 있었습니다.Person person = new Person("홓길동");checkPerson(person);String name = person.getName();// 출력값: 철수System.out.println(name);객체의 상태값을 비즈니스 로직 여기저.. 2025.03.05 SpringFramework 버그에 대한 불안감 떨쳐내기 Spock Test 개발자로 첫 취업 후 고객들에게 실질적으로 서비스되는 프로젝트 첫 배포는 정말 인생에서 잊지 못할 기억으로 남을 것 같습니다. 그때 당시 주니어 개발자인 저에게 메인 서비스 리뉴얼을 맡기고 배포할 수 있는 기회는 정말 소중했던 경험으로 죽을 때까지 잊지 못할 기억이 될 것 같습니다.잊지 못하는 기억에 이유는 물론 고객들이 실제로 사용하는 서비스를 배포하고 한다는 점도 있지만 버그가 발생할 것 같은 마음에 코드를 보고 또 봐도 마음 한편에 불안감 때문 이었던 것 같습니다. 지금도 경력이 짧지만 이제는 웬만한 버그없이 안정적으로 서비스를 개발하는 것 같습니다. 이런 안정감을 어떻게 저는 찾게 되었냐면 짧지만 경험을 통해 방어로직을 잘 구성하는 것 도 있지만 중요 로직에 대한 테스트시나리오를 구성하고 테스트.. 2025.02.19 레거시 Spring Framework Project 패키지 리팩토링 오늘은 팀원들과 협의해 리팩토링을 진행했던 이야기를 정리해보려 합니다.새로운 회사, 새로운 팀원, 기존 인원들의 개발 스타일에 적응해 나가며 이것저것 건의하고 의견을들어보고 개선해 나가야할 점들을 피력하고 있습니다.입사초기 Spring Framework와 Mybatis로 구성된 백오피스 서버 추가 기능개발 및 유지보수 업무를 진행했었습니다. 업무를 진행하며 큰 허들을 느꼈던 부분이 있었는데 그부분은 바로 지금은 너무나 당연 Dto 대한 책임분리였습니다.Spring Web Server를 구현한다면 일반적으로 데이터 전달을 위해 Dto를 많이 활용하실 겁니다. 다만제가 기능 추가, 유지보수업무를 받은 프로젝트는 모든 데이터를 HashMap으로 관리하고 상태를 변경하고 영속성에 저장하는 역할까지 책임지고 있.. 2025.02.16 Java 부동소수점 계산시 정확한 계산을 위해 왜 BigDesimal을 사용해야하는가? 오늘은 부동소수점 계산을 정확하게 하려면 왜 BigDesimal을 사용해야 하는지에 대해 한번 생각해 보겠습니다.부동소수점 정확도를 고민하게된건 회사에서 결제 서비스를 도입할 때였습니다.고객이 사용한 금액에 대해 수수료율을 계산하여 결제할 금액을 결정할 때 고객이 사용한 금액이 10원 단위로 딱 떨어지지도 않고 수수료율도 22%였기 때문에 double 자료형으로 수수료율을 계산하게 된다면 나머지가 남게 되어 순환소수가 발생해 버려 근삿값 2진수로 처리되어 오차가 발생할 여지 때문이었습니다.물론 큰 오차는 아니지만 회계, 세법 처리에 있어서 결제금액이 커질수록 작아 보이는 오차도 큰 금액이 되기 때문에 정확한 계산이 필요했었습니다.그래서 정확한 소수점계산을 위해 Java5에서 IBM의 기부로 완성된 Bi.. 2025.02.10 SpringFramework NullPointException 방지법 NullPointException자바 개발자라면 많이 마주치는 오류라고 단언컨데 이야기할 수 있을것 같습니다. 처음 자바 개발을 배우며 매번 만나던 오류였고 개발자로 취업후 2개월정도는 많이 고생했던 기억이 납니다. 이제는 NullPointException 에러방지는 몸에 습관이 되어서 잘 만나보지 못하지만 혹여나 NPE로 고생하시는 개발자분들 위해 간단하게 제가 Java Spring Framework에서 NPE를 방지하는 방법을 공유하도록 하겠습니다. // Db 엔티티 단건조회시 Optional 타입으로 조회Optional optionalBoard = boardRepository.findById(boardId);// 데이터가 존재하지 않을경우 체크if (optionalBoard.isEmpty()) { .. 2025.01.13 Spring Boot Batch 프로젝트에서 Webclient 사용시 주의점 오늘은 Spring Boot Batch 프로젝트에 Webclient 의존성을 추가하면서 발생한 이슈를 기록하고자 합니다. 이벤트 관련 Spring Boot Batch 비즈니스 로직을 작성하며 기술적 부채였던 RestTemplate을 더이상 사용하지 않고 점진적으로 Webclient로 교체해나가기 의존성을 추가하기로 결정하였습니다. implementation 'org.springframework.boot:spring-boot-starter-webflux' Webclient를 사용하기 위해서는 Webflux의존성을 추가하였는데 웬걸? Spring Boot Batch는 일괄작업만 하고 종료되기에 특별히 Web 요청을 받을 필요가 Spring Boot 기본적으로 추가되어 있는 임베디드 톰캣의존성을 제거하였는.. 2024.12.05 Spring Framework ResponseEntity 사용에 대한 고찰 현업에서 Spring Framework로 Rest Api서버를 구현하다보면 ReponseEntity를 자주 보게됩니다. Spring Framework Rest Api를 처음 공부할때는 ResponseEntity를 사용하지않고 대부분 Java 객체를 직접 응답하였는데 현업에서 기존에 있던 코드들을 확인해보니 ResponseEntity를 사용하여 Java 객체를 응답하는 형식으로 대부분 구성되어 있었습니다. 일반적으로 Java 객체를 응답해도 HTTP 프로토콜형식에 맞게 응답이 잘 되었는데 ResponseEntity를 사용하면 혹시나 내가 모르는 다른 차이점이 있나해서 눈으로 직접 확인해보기로 했습니다. @PostMapping public ResponseEntity requestOrder(@RequestBo.. 2024.11.17 현업에서 자주 사용한 Java Stream Api 제가 현업에서 Java 언어로 개발을 진행하며 가장 많이 사용하고 있는 Stream에 대해 이야기 해보려고 합니다.Java Stream Api는 Java 8에서 추가된 기능으로 Java의 Collection 요소를 간결하고 선언적으로 처리할 수 있는 Api 입니다.Java Stream에서 선언적 표현방식이라는 의미가 중요하게 언급되는데 여기서 선언적 표현 방식의 뜻은 무엇을 할 것이가에 집중하여 코드를 작성하는 방식을 의미한다고 합니다.선언적 표현방식과 대립되는 개념으로 명령형 표현방식이 있는데 아래 코드를 통해 비교해보도록 하겠습니다.아래 두 메소드는 Board Entity List를 Repository로부터 조회하여 응답 Dto로 변환하여 반환하는 메소드 입니다. // 명령형 방식의 메소드publi.. 2024.11.10 그럼에도 불구하고 Lombok을 도입해야하는 이유? 오늘은 Lombok이 도입되어 있지 않은 레거시 프로젝트에 롬복 라이브러리를 도입시도를 하며 경험했던 이야기를 해보려고 합니다. Lombok은 Java를 기반으로한 프로젝트에서 당연시 되는 라이브러리입니다. 하지만 제가 이번에 요구사항을 반영하고 코드 수정이 필요했던 프로젝트는 워낙 오래된 Spring 프로젝트이기도 했고 히스토리를 들어보니 Lombok을 도입하면 발생할 수 있는 사이드 이펙트에 대한 고민때문에 Lombok이 도입되어 있지 않은 상태였습니다. 그러면 왜 이제? 잘돌아 가는거 냅두면 되지 왜 롬복을 추가하냐 라는 점을 생각해 보았는데결국 제가 생각할 수 있던 이유는 생산성이였습니다. public class MemberDto { private String name; pri.. 2024.10.27 스프링 서버가 우아하게 죽는법 "Graceful Shutdown" 제가 속해있던 회사에서는 백엔드 어플레이케이션 서버는 Spring Framework를 사용했었고 Github marster 브렌치 머지 -> Github Action -> Aws ecr -> Aws ecs -> Aws ec2 CI/CD환경으로 구성되어 있었습니다. 다만 ec2에 새롭게 업데이트된 버전으로 docker container를 시작 시킬때는 꼭 ecs를 통해 자동으로 실행하는것이 아닌 개발자가 직접 베스찬 서버를 통해 프라이빗 네트워크의 ec2 하나하나 직접 접근하여 무중단 배포 롤링 방식으로 서버를 리스타트하는 정책으로 진행했었습니다. 추후 블루/그린, 카나리까지 염두하고 있었지만, 아직 서비스가 많이 크지 않았기 때문에 크게 문제 되는 배포 방식은 아녔습니다. 개발자로 첫 업무를 시작한 지 .. 2024.09.10