전체 글

주니어 개발자가 바라본 리팩터링과 테스트 코드의 중요성
들어가며몇 백줄, 혹은 그 이상의 라인이 존재하는 메서드나 클래스를 다루며 어려움을 겪은 경험이 있으신가요? 이 글을 읽는 대부분의 개발자들이 그렇다고 답하리라 생각합니다. 저 또한 복잡한 코드를 만나 어려움을 겪은 적이 종종 있습니다. 널리 알려져 있듯 이러한 문제를 해결하는 데 훌륭한 도구로 리팩터링과 테스트 코드가 있으며, 제 경험 또한 그러했습니다. 그래서 리팩터링과 테스트 코드의 중요성이라는 주제로 글을 작성하게 됐습니다. 다만 일반적으로 알려진 중요성을 나열하기 보다는 주니어 백엔드 개발자로서 왜 리팩터링과 테스트 코드가 중요하다고 느끼게 되었는지 그 경험을 담아내려 합니다. 코드로 알아보는 리팩터링의 중요성다음 코드는 GitHub에서 4k+ star를 받은 리팩터링 연습용 Code Kata입..

Spring - Spring Boot만 해왔다면 순수 Spring에서 유의할 점
최근 새로 담당하게 된 프로젝트의 프레임워크는 순수 Spring MVC 5.2.9 버전이다.어노테이션 방식을 사용하는 Spring Boot 프로젝트만 익숙했기에, 많은 설정이 xml파일을 통해 이뤄져있는 순수 Spring은 굉장히 낯설었다. 이에 어려움을 겪었던 부분에 대해 기록해자.1. 빈 등록 문제배경@RequiredArgsConstructor@Configurationpublic class JwtConfig { ... @Bean public JwtManager jwtManager() { return new JwtManager(...); } // 빈 등록 안됨 @Bean public JwtAuthenticationFilter jwtAuthentication..

라즈베리파이4 - 홈서버 구축기(외장 하드 마운트, 포트포워딩)
1. 라즈베리파이 OS 설치 및 SSH 접속모니터 없이 라즈베리파이4에 OS를 설치하고 SSH 접속을 하기 위해 Raspberry Pi Imager(이하 imager)를 활용한다.https://www.raspberrypi.com/software/imager를 활용해 원하는 OS 이미지를 선택하고, SSH 접속에 필요한 정보 및 wifi 정보를 설정한다.모든 설정이 완료되면 Micro SD 카드에 OS이미지를 저장한다. 이후 SD카드를 라즈베리파이4에 삽입 후 설정한 정보대로 SSH 접속을 하면 된다.라즈베리파이4의 IP주소는 공유기 관리자에 접속해서 확인할 수 있다. 참고 블로그 : https://main.tistory.com/2782. 외장 하드 마운트2-1. 장치 선택성능이 크게 중요하지 않았기에 중..

Spring - @Transactional 활용해 멀티 스레드 환경을 테스트할 때 주의점
문제 상황동시성 이슈를 고려해 상품의 재고량을 감소시키는 토이프로젝트를 할 때 발생한 문제다.동시성을 고려한 테스트를 위해 아래와 같이 코드를 작성했다.@Transactional@DisplayName("멀티 스레드 환경에서 상품 재고를 감소한다.")@Testvoid findAllProductsByNosWhenMultiThreadEnv() throws InterruptedException { // given Product product = createProduct(1000L, "1번 상품", 2000, 100); productRepository.save(product); OrderRequestDto orderRequestDto = new OrderRequestDto(); ..

Spring - 요청 파라미터 LocalDate타입 필드에 바인딩 및 검증
1. 배경 GET방식의 요청에서 쿼리 스트링으로 전달되는 값을 LocalDate 타입으로 변환하고, 검증할 때 겪은 문제다. 아래 처음에 작성한 코드다. startDate, endDate 두 개의 파라미터를 전달받아 LocalDate 타입으로 변환하고, null여부를 확인한다. 이 때 "http://localhost:8080/get?endDate=2024-04-01"로 요청하면 발생하는 문제는 크게 두 가지다. String -> LocalDate 변환 안됨 LocalDate의 null 검증 작동 안함 - null검증이 안되기 때문에 validateStartDtEarlierEndDt() 호출 후 NPE발생 @GetMapping("/get") public Object get(@Valid MyObject my..