/images/logo.png

inshining

가능한 최선을 다해 살고 싶다.

[모던자바인액션] 자바 람다

Modern Java In Action 에서 자바 8버전 이후 변경 사항을 갼락하게 소개하는 챕터로 시작한다. 예시를 들어가며 lambda를 소개한다. 이번 글에서 람다가 사용될 수 있는 예제를 통해서 람다 사용 방법에 대해서 알아보자. 변화하는 요구사항을 대처하기 위한 동적 파라미터화 문제 상황 동적 파라미터화 는 변화하는 요구사항을 유연하게 대처하기 위해 필요하다. 특정 조건에 해당하는 객체를 뽑아내야 한다. 예를 들어, 빨간색 사과만 뽑아내는 코드를 작성해보자 public static List<Apple> filterGreenApples(List<Apple> inventory){ List<Apple> result = new ArrayList<>(); for (Apple apple : inventory){ if (GREEN.

sonar 도입하기

정적분석이란? 소스코드의 실행 없이 정적으로 프로그램 문제를 찾는 것 <-> 동적분석: 런타임 환경에서 우리가 작성한 코드가 안전한지 테스트 코드로 진행 주요 분석 해주는 것 코드 스멜: 문제를 일으킬 가능성이 농후한 부분 잠재적인 결함 컨벤션 체크 보안 취약점 정적 분석을 하면 좋은점 보안 취약점 방지 SW 버그로 생기는 비용 절감 : 탐지하지 못한채로 출시하면 그 만큼 보수 비용이 들어감 컨벤션 통일성 도입 배경 홀로 개발할 수록 여러명이서 개발하는 것과 같은 환경을 만드는 것이 중요하다고 생각했다.

[서평] 테스트 주도 개발 시작하기

어디선가 TDD를 들어봤지만 선뜻 시도하기 어려운 이들을 위한 책 테스트 주도 개발 시작하기, 최범균, 가메출판사, 2022 소프트웨어가 고도화되고 그에 따라 소프트웨어 품질을 보장하기 위한 여러 개발 방법이 존재한다. TDD(Test-driven Development) 는 개발 방법론 중 하나로 우리 말로 번역하면 ‘테스트 주도 개발’ 개발 이라고 할 수 있다. 이름에서 알 수 있듯 테스트를 우선 작성한 뒤에 그 맞게 개발을 진행하는 방식이다. TDD는 켄트 백에 의해서 90년대 시작되었다. 국내에선 개발자 붐과 함께 각종 커뮤니티나 유튜브에서 TDD에 대한 언급이 늘어나고 있다.

GitHubActions로 자동 테스트 CI 도입하기

이전에 회사에서 githubActions 를 도입해본 경험이 있지만 PR 이전에 Integration 작업 도입해 본 적이 없다. 마침 스프링으로 사이드 프로젝트를 만들어보면서 테스트 코드를 작성해보고 있기 때문에 PR 이전에 테스트 코드가 모두 통과하도록 하는 CI를 만들어 보도록 하겠다. 여러 CI/CD 툴이 있겠지만 GitHubActions를 선택하였다. 현재 레포를 github에 포스팅하고 있기 때문에 연동하기 쉽고, 사용 방법이 간단하다는 장점이 있기 때문이다. 결국 CI/CD 툴도 컴퓨팅 리소스가 필요한데. 다른 툴을 도입하려면 컴퓨팅 리소스를 자체적으로 마련해야 하지만 githubActions는 컴퓨팅 리소스를 따로 마련하지 않고 무료로 사용할 수 있다는 점도 장점이다.

TIL: 서비스 레이어 간 분리

문제 상황 downloadFile 기능을 테스트 코드로 작성하던 중 테스트를 위한 임시 파일 생성과 다운로드 기능에서 계속된 에러가 발생했다. 임시 파일 생성하고 해당 파일을 다운로드 받아야 하는데. 생성된 파일 경로를 읽어 오지 못했기 때문이다. 테스트하기 어려운 구조로 짜여져있다는 것을 깨닫고 고칠려고 했다. 그러다보니 해당 테스트는 메타 데이터에 관한 테스트인데. 실제 파일 생성과 다운로드를 테스트 과정에 집어넣는 것이 잘못된 것이라고 깨닫고 분리하려고 했다. 요약하자면 테스트하기 어려운 구조로 변경하려다가 서비스 레이어 코드에서 분리가 필요하다고 느꼈다.

Controller <-> Service 간 DTO 도입

문제 상황 Controller 테스트 코드 작성시에 성공과 실패 코드 짜는 중에 서비스 레이어에서 단순히 String 타입으로 리턴하기 때문에 비정상적인 결과를 표기할 수 없었다. 테스트 코드 @Test public void testUpload() throws Exception{ MockMultipartFile file = new MockMultipartFile( "file", "hello.txt", MediaType.TEXT_PLAIN_VALUE, "Hello, World!".getBytes() ); when(metaDataService.uploadFile(file, "test")).thenReturn("File uploaded successfully"); mockMvc.perform( multipart("/file/upload").file(file) .param("user", "test") ).andExpect(status().isOk()) .andExpect(content().string("File uploaded successfully")); } 이전 Controller 코드 if (file.isEmpty()) { return ResponseEntity.badRequest().body("Please select a file to upload"); } String body = metaDataService.