본문 바로가기

자바17

잘 알아보고 사용하자 Java Annotation(주석) 오픈소스를 개발하면서 @AggregateId 라는 필드를 추가할 적이였다. Id 에 대해서 자동생성시키기 위한 @AggregateId(assignStrategy=AUTO or MANUAL) 같이 만들고자 했으나, 그렇게 하면 안될 것 같다는 피드백을 받았다. 왜일까? Java 에서 쓰이는 Annotation 은 무엇인가? 위키 백과 따르면 다음과 같다. 자바 애너테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @ 기호를 앞에 붙여서 사용한다. JDK 1.5 버전 이상에서 사용 가능하다. 자바 애너테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다. 여기서 말하는 메타데이터는 무엇일까? 메타데이터(m.. 2024. 3. 10.
Java 에 Enum Circular Dependency 이라는 말을 들어봤나요? 문제 어느 날과 다르지 않는 기능 개발 중에 이상한 상황을 마주쳤습니다. 코드부터 살펴보겠습니다. enum DisplayType { DISPLAY_1("1", ServiceType.SERVICE_A), DISPLAY_2("2", ServiceType.SERVICE_A), DISPLAY_3("3", ServiceType.SERVICE_B), DISPLAY_4("4", ServiceType.SERVICE_B); private final String name; private final ServiceType serviceType; DisplayType(String name, ServiceType serviceType) { this.name = name; this.serviceType = serviceType; .. 2023. 12. 16.
TestContainer 를 통해 테스트 용이성 높이기 - 입문 TestContainer TestContainers 라는 라이브러리는 테스트 코드에서 손쉽게 원하는 모듈을 테스트용도로 띄우고 내릴 수 있습니다. // add in build.gradle testImplementation 'org.testcontainers:testcontainers:1.16.3' 그 외에도 아래 모듈을 테스트에서 테스트만을 위한 모듈을 실행할 수 있습니다. 왜? 이 TestContainers 를 잘 알아야 하는가요? 우리가 운영하는 서비스는 많은 MicroSerivce로 이루어져 있습니다. 그리고, 여러 모듈은 각각의 의존성을 갖게됩니다. 구체적인 예시를 살펴볼게요. 위 아키텍쳐에서는 SERVICE-DISCOVERY와 CONFIGURATION-SERVER 를 활용하고 있다고 가정합니다... 2022. 4. 17.
[우아한테크코스Pro]인수테스트 주도 개발[3/9] 인수테스트 주도 개발이란 무엇인가? 개인적인 생각으로서, 설명할 때테스트 주도 개발(TDD) 의 단점을 해소시켜주는 개발론 중 하나라고 말씀드리고 싶습니다. TDD 라는 것은 실패한 테스트케이스를 작성하고, 이를 통과시키면서 개발해나가는 방법을 말합니다. TDD 단점으로 생각해보면, 실패한 테스트라는 것을 무엇을 어디에서부터 어떻게 테스트를 해야될지? 판단하기 어렵다는 부분에 있습니다. 이런 문제를 해소시켜 주는 개발 방법론으로서 인수주도 테스트 개발 이라는 것이 나옵니다. 어떻게 이런 부분을 도와줄수 있을까요? 이부분을 학습하기 위해서 우아한테크캠프pro 에서는 3주차 과제로 인수 테스트 주도 개발을 체험해볼 수 있는 시간을 가졌습니다. 이미 어느정도 작성된 코드를 Fork 받아, 인수테스트 를 작성하.. 2021. 6. 15.
빠르게 실패하기(fail-fast) VS 안전하게 실패하기(fail-safe) 이 주제에 대해서 "엘레강트 오브젝트-조영호 번역" 책에서 다루고 있습니다. 이론상으로만, 이해하고 있었습니다. 그러나, 최근 사내 서비스를 트러블 슈팅하며, 다른 분의 코드를 리뷰하며 이 주제에 대해서 말할 수 있었던 기회가 있었습니다. 그러나, 역시 이론과 코드에는 거리감이 있었고, 그 상황에서 저또한 명확하게 설명하기 힘들었습니다. 저 스스로는 빠르게 실패하기 를 실천하기 위해서 코드 상에서 노력하고 있는데, 이것을 누군가에게 설명하려니 잘 안되더군요. 그래서 팀원분에게 이 부분을 설명해주면서 헀던 이야기를 공유합니다. 먼저 빠르게 실패하기와 안전하게 실패하기에 대해서 이론으로 살펴보고 난 뒤에, 코드로서 살펴보겠습니다. 이 두 가지는 적절한 상황에 잘 활용하는 것이 중요하지만-, 만약 코딩 중에 .. 2021. 4. 16.
계약에 의한 설계(Contract By Design) 더 잘 활용하기(with java) 들어가기 계약에 의한 설계(Contract By Design) 라는 용어에 대해서 조영호님의 Object 책에서 처음 접하게 되었습니다. 계약에 의해 설계가 이루어지지 않는 코드에서 발생하는 문제점을 운영중인 프로덕트 코드에서 쉽게 발견할 수 있었고, 이를 계기로 사내에 '계약에 의한 설계' 라는 이름으로 세미나까지 하게 되었습니다. 발표자료 그러나, 발표를 하면서도 '실제 동작되는 코드에서는 어떻게 '계약에 의한 설계' 를 지킬 수 있을까?' 라는 생각을 했습니다. 실제로 계약에 의한 설계(Contract By Design) 를 준수하기 위해서 구글이 만든 cofoja 라는 라이브러리도 있고, vanilla4j 라는 라이브러리도 있었습니다. 하지만 이 두 개의 라이브러리를 적극적으로 활용하지 못한 이유.. 2021. 4. 5.
Mock 객체란 무엇일까? 왜 써야될까? 아래 내용은 위 책에서 말하는 4장 TDD with Mock 에서 내용을 발췌했습니다. TDD를 공부하면서 Mock 이라는 용어는 너무나도 많이 나오고, 실제로 테스트 프레임워크를 사용하면 Mock 객체를 많이 사용되게 된다. 그놈의 Mock! Mock 객체를 사용해서, 테스트를 용이하게 만들수 있고, 아직 만들어지지 않은 개념을 활용해 내가 만들고자 하는 객체를 구체화시킬 수 있는 도구라는 사실은 알았다. 그러나 문제점은 여기에 있었다. 주로 Mockito 프레임워크를 사용하는데, 각 Mock 객체가 어떤 역할을 하는지 이해하기 어려웠다. 더하여, 어떻게 활용해야 하는지도, 이해하기 어려웠다. 이번 장에서는 다시한번 Mock을 써야하는 이유, 그리고 Mock 객체가 어떤 역할을 하는지, 마지막으로 어떻.. 2021. 3. 11.
Getter와 Setter는 왜 써야 할까? 꼭 써야될까? 들어가기 엘레강트 오브젝트 책을 읽으면서, getter, setter에 대해서 궁금증을 가질 수 있었습니다. 자바 진영에서는 Lombok 때문에라도 Getter, Setter를 더욱 편하게 쓸수 있습니다. 또한, 뜻이 맞는 이와 소통하는 방에서도 비슷한 질문이 나와서 아래와같이 답변했습니다. 왜 Getter와 Setter를 사용할까? Getter와 Setter를 이해하기 위해선는, 자료구조와 객체의 차이점을 먼저 이해해야한다고 생각합니다. 클린코드에서나 또는 구글에서 객체와 자료구조에 대한 차이점을 검색하면 여러 결과물이 나옵니다. 몃가지 내용을 정리하면 아래와 같습니다. 객체와 자료구조의 차이점은 무엇일까? 객체는 추상화된 인터페이스 뒤로 자료를 숨긴 채 데이터를 다루는 함수만 공개합니다. 자료구조는 .. 2021. 2. 27.
예외를 처리하는 Best Practice는 무엇일까?(with. 토비 스프링, 이펙티브 자바) 들어가기 예외를 어떻게 하면 우아하게 처리할 수 있을까? 위 질문의 답을 찾기 위해- 이제부터 토비 스프링의 책 내용과 이펙티브 자바의 내용을 소개하고자 한다. 예외 블랙홀 예외를 잡고 아무 행위도 하지 않는다. 이것은 굉장히 위험한 행위이다. 이런 코드도 마찬가지로 위험한 코드이다 그렇다면? 어떻게 해야될까? 예외를 처리할 때는 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보돼야 한다. 또한 Throws 는 무의하고 무책임하다. 바로 아래와 같은 코드를 말한다. 위 두 가지 나쁜 습관은 어떤 경우에도 용납하지 않아야 한다. Item77. 예외를 무시하지 말라. - 이펙티브 자바 왜 우리는 예외를 명시하는 이유가 무엇인가? API 설계자에게 메서드 선언에 예.. 2021. 1. 4.
테스트 더블을 강력한 위력을 이해해보자. 아래 내용은 Effective Unit Testing - 라쎼 코스켈라 에서 발췌한 내용으로 이루어져 있습니다. 0. 들어가기 Stub과 Dummy는 왜 태어났을까? 이 둘의 처음 등장된 가장 큰 이유는 제품에 다른 제품이 준비되기 전까지 대신 사용할 용품이 필요했기 때문이다. 그러나 오늘날, Stub과 Dummy는 처음 나왔던 목적보다, 테스트 추종자에 의해 쓰음새가 다양해졌다. 다양한 테스트 전용 장치가 만들어지면서, 테스트 대상 코드를 격리 속도 개선 예측 불가능한 요소 제거 특수한 상을 시뮬레이션 감춰진 정보를 얻어내는 용도 이같이 목적은 비슷하면서도 다른 객체를 사용하는데 그 전부를 테스트 더블이라고 한다. 그럼 테스트 더블은 우리에게 어떤 득이 있을까? 1. 테스트 더블의 목적 "세상이 변하길.. 2020. 12. 28.
Java Garbage Collection 다시 살펴보기 출처: d2.naver.com/helloworld/1329 docs.google.com/presentation/d/1wkTP8YaSsxK-Zjd_cv9ofBEgihz1-ZiZfXNWYo3oRPM/edit#slide=id.g8c711dc557_1_92 과정 GC에 대해서 알아보기 전에 알아야 할 용어가 있다. 바로 'stop-the-world'이다. stop-the-world란, GC을 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다. GC 작업을 완료한 이후에야 중단했던 작업을 다시 시작한다. 어떤 GC 알고리즘을 사용하더라도 stop-the-world는 발생한다. 대개의 경우 GC 튜닝이.. 2020. 11. 25.
JVM 이해하기 - 2 (자바의 바이트 코드) Write Once, Run anywhere(WORA) 자바의 바이트 코드 WORA를 구현하기 위해 JVM은 사용자 언어인 자바와 기계어 사이의 중간 언어인 자바 바이트코드를 사용합니다. 이 자바 바이트코드가 자바 코드를 배포하는 가장 작은 단위입니다. JVM을 이야기 할 때에는 자바 바이트코드를 빼놓을 수 없다. JVM은 자바 바이트코드를 실행하는 실행기이다. 자바 컴파일러는 C/C++등의 컴파일러처럼 고수준 언어를 기계어, 즉 직접적인 CPU명령으로 변환하는 것이 아니라, 개발자가 이해하는 자바 언어를 JVM이 이해하는 자바 바이트코드로 번역한다. 따라서 자바 바이트코드는 플랫폼 의존적인 코드가 없기 때문에 JVM이 설치된 장비라면 CPU나 운영체제가 다르더라도 실행할 수 있고, 컴파일 결과물의 크기.. 2020. 11. 24.
JVM 이해하기 - 1 (JVM 특징 이해하기) 자바를 이용하는 개발자라면 자바 바이트 코드가 JRE위에서 동작됨을 이해한다. 그러나, JRE에서 가장 중요한 요소는 자바 바이트 코드를 해석하고 실행하는 JVM(Java Virtual Machine) JVM은 하나의 개념이고, 스펙이다. 이를 구현한 객체가 Java VM, Delvik VM 등이 있다. JRE는 자바 API와 JVM, Native Method으로 구성되며, JVM의 역할은 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽어 들여서 자바 API와 함께 실행하는 것 JVM의 특징 스택 기반의 가상 머신 : 대표적인 컴퓨터 아키텍처인 인텔 x86아키텍처, ARM 아키텍처와 같은 하드웨어가 레지스터 기반으로 동작하는 데 비해 JVM은 스택 기반으로 동작한다. 심볼릭 레퍼런스 .. 2020. 11. 24.
알아야만 하는 Java.time API 총 정리[실무&고급편] 1. 날짜와 시간 조작하기 1.1. 날짜와 시간을 더하거나 빼는 메소드 LocalDate, LocalDateTime, ZonedDateTime 클래스는 각각 년, 월, 일, 주를 더하거나 뺄 수 있습니다. LocalDateTime currentDateTime = LocalDateTime.now(); LocalDateTime targetDateTime = currentDateTime .plusYears(long) // 년도 더하기 .minusYears(long) // 년도 빼기 .plusMonths(long) // 월 더하기 .minusMonths(long) // 월 빼기 .plusDays(long) // 일 더하기 .minusDays(long) // 일 빼기 .plusWeeks(long) // 주 더하기.. 2020. 9. 20.
나는 AssertJ와 같이 'Fluent API' 유사 라이브러리 만들기 를 왜 실패했을까? 들어가기 지난 시간에 JCenter() 에 Assertion 라이브러리를 올리는 행위를 했었습니다. JCenter()에 올린 Assertion 을 'fluent' API와 같은 AssertJ 라이브러리를 컨셉으로 잡고, 만들기를 시도했습니다. 결과적으로는, 사실 실패했습니다. 만들수 있지만, 그 코드량이 간단하지 않아서 문제였습니다. 그 과정중에 겪었던 내용에 대해서 공유하는 시간을 갖도록 하겠습니다. AssertJ 란 무엇인가? joel-costigliola.github.io/assertj/ AssertJ / Fluent assertions for java AssertJ Fluent assertions for java joel-costigliola.github.io Fluent API란 쉽게 생각하면,.. 2020. 9. 19.
자바의 리플렉션(Reflection)을 코드와 함께 이해하기 Photo by Maria Teneva on Unsplash 리플렉션 이해하기 해당 세미나는 외부교육으로 들은 더자바를 수강하고 시작하는 강의입니다. 우리의 최종 목표는 Spring에서 사용되는 DI의 동작원리를 이해하는 것입니다. 내용에 나오는 코드는 여기에서 좀 더 자세히 보실 수 있습니다. 1. 스프링의 Depedency Injection은 어떻게 동작할까? spring init 으로 프로젝트 만들기 book, bookSerivce, bookRepository 생성후 DI 하기. 2. 리플렉션 API - 클래스 정보 조회 Branch> 01-reflection-api-클래스-정보-조회 리플렉션의 시작은 Class https://docs.oracle.com/javase/8/docs/api/java/l.. 2020. 9. 16.
Spring5 를 왜 사용해야되는건가?(with Tody Lee) 우연히 재미있는 유튜브 동영상을 시청했습니다. 구글 알고리즘에 의해서 노출되었는데, 제목에 이끌러 재생 버튼을 눌렀습니다. "자바9와 Spring5로 바라보는 Java의 변화와 도전" youtu.be/BFjrmj4p3_Y 해당 동영상에서 말하는 내용에 제가 느낀바 추가해서 중요하다고 생각되는 부분만 정리했습니다. 그리고 실제로 코드로 작성하는 행위까지 이어질 예정입니다. Spring 5 가 2017년 9월 27일출시됐는데, 지금이 2020년이니까, 3년이 지난 시점에서 여전히 Spring5는 사용하는 곳보다 사용하지 않는 곳이 더 많습니다. 이 글을 쓰는 저 또한 Spring5를 사용해본 경험이 없습니다. 애노테이션 기반의 스프링 버전 4.x 를 베이스로 하는 SpringBoot만 사용해왔습니다. 스프.. 2020. 8. 23.