본문 바로가기

Java24

왜 서비스로더(ServiceLoader)를 알아야 하는가? java docs 에서 Service Loader 를 다음과 같은 한줄로 정의한다. A facility to load implementations of a service. 서비스 구현을 로드하는 기능입니다. 서비스 구현을 로드하는 기능이 왜 필요한지 부터 이해할 필요가 있을 것 같다. (여기서 서비스 구현의 의미는 비지니스 로직이 담겨진 구체적 클래스를 의미한다.) 우리가 라면을 만드는 코딩을 한다고 가정해보자. public class 신라면제조 { public void make() { pourWater(); boilWater(); putNoodle(); boilNoodle(); putSoup(); putVegetable(); } public static void main(String[] args) { .. 2024. 3. 21.
잘 알아보고 사용하자 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.
Java Regex 정규표현식 사용시 java.lang.StackOverflowError 가 발생하는걸까 자바에서 정규표현식을 활용하다보면, BuiltIn 클래스인 Pattern 과 Matcher 이 두 가지를 사용하는 경우가 많다. Pattern 과 Matcher 을 사용할 때 주의해야될 점이 있다. 바로 재귀로 인해 무한한 루프에 빠질 수 있다는 것이다. 이로인해 위에서 말하 StackOverflowError 가 발생한다. public class RegexTest { public static void main(String[] args) { // 재귀적으로 일치하는 패턴 Pattern pattern = Pattern.compile("(a|b)*c"); Matcher matcher = pattern.matcher("aaa" + "aaa"); System.out.println(matcher.matches()).. 2023. 2. 25.
싱글톤(Singleton) 패턴 이해하기 인스턴스를 오직 한개만 제공하는 클래스 1. 간단한 싱글톤 구현 package me.likelen.study.singleton; public class Settings1 { private static Settings1 instance; private Settings1() { } public static Settings1 getInstance() { if (instance == null) { instance = new Settings1(); } return instance; } } 질문 1. 생성자를 private 으로 만든 이유는 무엇인가요? 오직 한 개의 인스턴스에만 접근하기 위해 생성자의 노출을 막기 위해서입니다. 2. getInstance() 메소드를 static으로 선언한 이유는 무엇인가요? 글로.. 2022. 2. 6.
Java LocalDateTime.toString()은 JavaScript에서 어떻게 호환될까? 폴리글랏으로 프로그래밍하며, 여러 언어로된 도메인끼리 메세지를 보내다보니 파일 포맷에 대한 이슈가 있었다. LocalDateTime.now() 를 외부에 전송하게 되면 "2021-11-02T00:05:03.128" 이런식의 String 으로 발송된다. Javascript 에서 이를 호환된 포맷으로 전송하기 위해서는 moment 를 사용할 경우에는 아래와 같은 포맷으로 작성하면 된다. moment.tz('Asia/Seoul').format('YYYY-MM-DD[T]HH:mm:ss.SSS') 참고자료 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns DateTimeFormatter (Java Pl.. 2021. 11. 2.
#1 스터디 할래 - 1주차 1. JVM이란 무엇인가? JVM 은 Java Virtual Machine 의 약자로서, Java 가 동작될 때 동작될 수 있는 플랫폼을 제공해준다. 이는 즉 다시 말하면 Java로 개발한 프로그램을 컴파일하여 만들어지는 바이트코드를 실행시킬 수 있는 가상머신이다. JVM 의 가장 큰 특징으로는 Write one, Run anywhere 라는 모토이다. 이는 어떤 OS의 제약에도 해당되지 않는 것과 같다. JVM의 컴파일러가 .java 소스파일을 컴파일하면 .class 클래스 파일을 JVM에게 건네주게 되면 JVM이 클래스파일을 메모리에 로드하여 실행할 수 있다. 여기서 컴파일러는 프론트엔드에 속하고, JVM은 백엔드에 속한다. 이말은 위에서 말한것과같이 .java 를 Compiler 를 통해 Compi.. 2021. 10. 30.
[우아한테크코스Pro]인수테스트 주도 개발[3/9] 인수테스트 주도 개발이란 무엇인가? 개인적인 생각으로서, 설명할 때테스트 주도 개발(TDD) 의 단점을 해소시켜주는 개발론 중 하나라고 말씀드리고 싶습니다. TDD 라는 것은 실패한 테스트케이스를 작성하고, 이를 통과시키면서 개발해나가는 방법을 말합니다. TDD 단점으로 생각해보면, 실패한 테스트라는 것을 무엇을 어디에서부터 어떻게 테스트를 해야될지? 판단하기 어렵다는 부분에 있습니다. 이런 문제를 해소시켜 주는 개발 방법론으로서 인수주도 테스트 개발 이라는 것이 나옵니다. 어떻게 이런 부분을 도와줄수 있을까요? 이부분을 학습하기 위해서 우아한테크캠프pro 에서는 3주차 과제로 인수 테스트 주도 개발을 체험해볼 수 있는 시간을 가졌습니다. 이미 어느정도 작성된 코드를 Fork 받아, 인수테스트 를 작성하.. 2021. 6. 15.
계약에 의한 설계(Contract By Design) 더 잘 활용하기(with java) 들어가기 계약에 의한 설계(Contract By Design) 라는 용어에 대해서 조영호님의 Object 책에서 처음 접하게 되었습니다. 계약에 의해 설계가 이루어지지 않는 코드에서 발생하는 문제점을 운영중인 프로덕트 코드에서 쉽게 발견할 수 있었고, 이를 계기로 사내에 '계약에 의한 설계' 라는 이름으로 세미나까지 하게 되었습니다. 발표자료 그러나, 발표를 하면서도 '실제 동작되는 코드에서는 어떻게 '계약에 의한 설계' 를 지킬 수 있을까?' 라는 생각을 했습니다. 실제로 계약에 의한 설계(Contract By Design) 를 준수하기 위해서 구글이 만든 cofoja 라는 라이브러리도 있고, vanilla4j 라는 라이브러리도 있었습니다. 하지만 이 두 개의 라이브러리를 적극적으로 활용하지 못한 이유.. 2021. 4. 5.
예외를 처리하는 Best Practice는 무엇일까?(with. 토비 스프링, 이펙티브 자바) 들어가기 예외를 어떻게 하면 우아하게 처리할 수 있을까? 위 질문의 답을 찾기 위해- 이제부터 토비 스프링의 책 내용과 이펙티브 자바의 내용을 소개하고자 한다. 예외 블랙홀 예외를 잡고 아무 행위도 하지 않는다. 이것은 굉장히 위험한 행위이다. 이런 코드도 마찬가지로 위험한 코드이다 그렇다면? 어떻게 해야될까? 예외를 처리할 때는 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보돼야 한다. 또한 Throws 는 무의하고 무책임하다. 바로 아래와 같은 코드를 말한다. 위 두 가지 나쁜 습관은 어떤 경우에도 용납하지 않아야 한다. Item77. 예외를 무시하지 말라. - 이펙티브 자바 왜 우리는 예외를 명시하는 이유가 무엇인가? API 설계자에게 메서드 선언에 예.. 2021. 1. 4.
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.
4. Gradle 프로젝트에서 Swagger Codegen 적용하기. SwaggerCodeGen CLI 에 대한 설명은 이전에 했었습니다. 이제부터는 Gradle 프로젝트에 SwaggerCodegen을 적용하는 방법에 대해서 알아보겠습니다. 먼저 Gralde SwaggerCodegen Plugin 을 알아야 합니다. 저 또한 여기 나온 메뉴얼대로 진행했습니다. 당연히 우선적으로 행해져야 하는 부분은 의존성을 추가하는거겠죠? plugins { id 'org.hidetake.swagger.generator' version '2.18.2' } repositories { jcenter() } dependencies { swaggerCodegen 'io.swagger:swagger-codegen-cli:2.4.2' // Swagger Codegen V2 swaggerCodegen .. 2020. 10. 18.
LazyInitializationException 를 벗어나기 위해서는 어떻게 해야될까? JPA에서 최적의 쿼리를 보내는 방법은 무엇일까? Photo by Jan Antonin Kolar on Unsplash 들어가기 JPA의 연관관계를 사용하다 사용하지 않으니까, 금방 까먹고, 또다시 공부하는 제 모습을 보면서, 이 부분은 어느 정도 정리해야겠다는 마음으로 포스팅을 작성합니다. 이 글은 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 학습한 뒤, 일부 내용을 편집했습니다. 리뷰 전체적으로 김영한 강사님의 노하우가 '녹아내려있다' 라는 생각은 강하게 들었습니다. 당연하다고 여겨지는 부분이라도 직접 동작하는 코드로 이해하지 않는다면, 이해하지 않은 것이라고 했습니다. 그런 측면에서 이번 강의는 당연하지만 실행해보지 않았기에 몰랐던 부분을 잘 집어주는 부분이 많았습니다. LazyInitializationException 는 왜.. 2020. 10. 3.
알아야만 하는 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.
알아야만 하는 Java.time API 총 정리[기본편] 들어가기 개발을 하다보면, 언젠간 마주치게 되는 날짜 관련 API. 자바의 경우 날짜 관련된 검색(ex, 7월의 한달은 몃일까?)을 하면 이전에 자바8 이전의 데이터가 비교적 많이 검색됩니다. 또한 Java 8에서 제공해주는 LocalDateTime 관련 API 를 사용하더라고, 그 라이브러리를 잘 모르니까 때문에 언젠간 한번 쯤 정리가 필요하다고 느꼈습니다. 이 포스팅 시리즈는 LocalDate, LocalTime 다 쓸 수 있다고 자부하더라도, Temporal 이 무엇인지 몰라서 헤매는 저같은 사람에게 꼭 필요합니다. 다음 포스팅으로 알아야만 하는 Java.time API 총 정리[실무&고급편] 추가했습니다. 0.LoadMap 기본편에서는 LocalDate, LocalTime, Instant, Dur.. 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.
자바의 직렬화(serialization)를 코드와 함께 이해하기 Photo by Casey Horner on Unsplash 회사 사내세미나를 했던 자료를 옮겨왔습니다. 자세한 소스코드는 여기를 참고해주세요. 1. 직렬화란 무엇일까요? serialization (or serialisation) is the process of translating data structures or object state into a format that can be stored (for example, in a file or memory buffer) or transmitted (for example, across a network connection link) and reconstructed later (possibly in a different computer environment.. 2020. 9. 16.
[나만의 라이브러리 제작기-2] JFlog Bintary는 무엇이고, 어떻게 라이브러리를 올렸는가? 들어가기 JFlog Bintray는 자바 의존성을 추가하기 위한 공개 저장소 중 JCenter에 배포하기 위해 존재하는 플랫폼 중 일부입니다. 그 부분에 대해서 좀 더 자세히 살펴보고, 올리는 과정에서 겪었던 이슈를 적어볼까 합니다. JFlog Bintray? 사실 위에서 언급한 것과 같이, JFlog는 그저 배포를 위한 플랫폼 중 일 부분입니다. Bintray는 "Software Distrubutuin as Service" 로서 홈페이지 설명에 따르면, - 단 한번의 배포로, 다양한 주요 패키지(docekr, debian, npm, maven ... )들을 한번에 배포할 수 있게 도와준다. - REST API를 활용하기 때문에 Jenkins와 같은 배포 도구에도 손쉽게 붙여 사용할 수 있다. - 그리고.. 2020. 9. 12.
[나만의 라이브러리 제작기-1] JCenter, MavenCentral 은 무엇인가? 들어가기 이번에 같이 스터디하는 햇님들과 함께 이야기를 나누다, 우리가 프로젝트를 진행시 자주 사용되는 Utility 성격의 Module은 라이브러리로 만든다면 어떠할까? 라는 질문으로 라이브러리를 제작하게 되었습니다. Assertion 이라는 라이브러리를 만들기 위한 여정으로, 그 시작은 JCenter, MavenCentral 등 흔히 Repository 라 불리는 것이 무엇인지에 대해서 이해해보려 합니다. 'Repository라 불리는 것은 무엇인가?' , 'gradle을 사용하지만, Maven Repository에 올릴 수 있는것인가?' 'Repository에 어떻게 올리는 것인가?' 등등 궁금한 부분이 많았습니다. 궁금증도 해결할 겸 나중에 이런 행위를 했었다는 것을 기억하기 위해 포스팅합니다. .. 2020. 9. 12.