Record record 클래스를 잘 알고 사용하기 위해 java14에 출시한 record 클래스를 알아보려고 합니다. Intro Record 클래스는 데이터를 저장하는 데 사용되는 DTO(Data Transfer Object)나 VO(Value Object) 같은 간단한 데이터를 운반하기 위한 불변 클래스를 정의할 때 간결하고 유용하게 사용할 수 있습니다. record 클래스는 데이터를 저장하는데 사용되는 DTO(Data Transfer Object)라고 불리는 클래스를 API 요청, 쿼리 결과 등의 데이터 이동에 사용하곤 합니다. DTO는 대부분 불변성을 가지고 있는데, 불변 클래스로 만들기 위해 적지 않은 노력이 필요합니다. 각 데이터에 private, final 키워드 선언 각 필드에 대한 get..
파일 시그니처로 유효성 검사하기 기존 반품 신청 시 이미지만 업로드가 가능했었는데요. 이번에 동영상도 업로드가 가능하도록 기능을 추가하게 되었습니다. 클레임 영역에서 동영상 업로드/재생 로직을 신규로 구현하다 보니 신경 써야 할 요소들이 다소 있었습니다. 그중에서 파일 시그니처로 파일 유효성 검사에 대한 내용을 다뤄보려고 합니다. 어느 날 점심을 먹으러 가는 길에 팀원분과 파일 업로드 관련하여 이야기를 나누던 중 팀원분이 문득 "바이러스 파일을 업로드 가능한 확장자로 변경해서 업로드하게 되면 바이러스도 업로드가 가능하지 않을까?"라는 의문을 공유해 주셨습니다. 당시에는 "설마 클레임 신청 시 바이러스를 업로드하는 사람이 있을까?"라고 단순하게 생각했었지만, 계속 생각하다 보니 충분히 가능성이 있는 사례였..
Java CompletableFuture java 5에서 Future interface 는 비동기식 연산이 기능하도록 추가되었지만, 계산을 결합하거나 발생 가능한 오류를 처리할 수 있는 방법은 없었다. . java 8은 Future interface, CompleteStage interface 를 구현한 CompletableFuture class 를 선보였다. CompletableFuture 클래스는 다른 단계들과 결합할 수 있는 비동기 연산 단계에 대한 계약을 정의한다. 추가로, 비동기 연산 단계 및 오류 처리를 위한 약 50가지의 다양한 방법을 제공한다. CompletableFuture with Encapsulated Computation Logic public static CompletableFut..
Java Garbage Collection(GC) Effective Java 3/E 책을 보면서 GC에 대한 이야기가 많이 언급되었다. 한 번쯤 공부해 두면 도움이 될 것 같다는 생각에 관련 기사를 읽어보며 정리를 해보았다. ... 애플리케이션에서 성능의 가장 중요한 측면 중 하나는 올바른 GC를 선택하고 이를 최적화는 것이다. 최적의 GC 선택은 각 애플리케이션의 동작 및 요구사항에 따라 달라지므로 자바 개발자는 GC를 이해하는 것이 중요하다. Memory management and avoiding memory leaks 자바는 객체 사용 후 메모리에서 각 객체를 제거하는 자동 GC 실행 애플리케이션에서 생성된 자바 객체는 힙이라는 메모리 세그먼트에 저장 애플리케이션이 새 객체를 생성하고 힙이 가득 차..
Functional Interfaces in Java Functional Interfaces 한 개의 추상 메서드를 가지는 인터페이스 인터페이스에 여러 개의 디폴트 메서드가 있더라도 추상 메서드가 하나라면 함수형 인터페이스 람다 표현식은 함수형 인터페이스로만 사용 가능 함수형 인터페이스를 직접 만들 경우 @FunctionalInterface 어노테이션을 사용하면, 해당 인터페이스가 함수형 인터페이스 조건에 충족하는지 검증 Multiple non-overriding abstract methods found in interface com.practice.notepad.CustomFunctionalInterface Functional Interfaces in Java 함수형 인터페이스 Descripter Me..
Request multipart/form-data type API by attaching a file 서버단에서 multipart/form-data 타입으로 파일을 첨부해서 요청을 보내본 적은 없었는데.. 이번에 관련 작업을 하면서 정리를 해보고자 한다. (여기서 파일은 이미지 URL 을 저장해서 보낸다.) MultipartFile multipart/form-data 타입으로 Request 시 MultipartFile 객체가 필요하다. @PostMapping(value = "/sample/image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) SampleResponse uploadImage(MultipartFile upload, @RequestHeader(va..
Java PlayGround [Java] 자바 플레이그라운드 with TDD, CleanCode 후기 (2) NEXTSTEP 자바 플레이그라운드 with TDD, 클린 코드에서 새롭게 배우고 깨닫게 된 내용들을 기록한 글입니다. Part02. Inheritance, Abstract, Functional programming Inheritance 상속을 통한 중복 코드 제거 중복 코드를 별도의 클래스로 분리해보자. extends 부모 클래스의 모든 필드와 메소드를 자식 클래스가 상속하도록 지원하는 keyword 상속을 할 경우 멤버 필드와 메소드를 하위 클래스에서 그대로 상속 Abstract 추상화를 통한 중복 제거 역할이 비슷한 메서드를 추상화 시켜 중복을 제거해보자. abstract 클래스를 추상 클래..
Java PlayGround NEXTSTEP 자바 플레이그라운드 with TDD, 클린 코드에서 새롭게 배우고 깨닫게 된 내용들을 기록한 글입니다. . Part01. 단위테스트, TDD . 시작 소트웍스 앤솔러지에서 말하는 객체 지향 프로그래밍을 잘하기 위한 9가지 원칙 한 메서드에서 오직 한 단계의 들여쓰기만 허용하자 else 예약어를 사용하지 말자. 모든 원시 값과 문자열을 포장하자. 한 줄에 점을 하나만 찍자. 축약과 같이 줄여 사용하지 말자. 모든 엔티티를 작게 유지하자. 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 말자. 일급 컬렉션을 사용하자. getter/setter/프로퍼티를 사용하지 말자. 단위 테스트 JUnit는 프로덕션 코드를 편리하게 테스트할 수 있도록 도와준다. JUnit 5...