[Spring] 직접 개발한 라이브러리 Fortune Cookie : API 응답에 재미 더하기
·
Spring/Spring에서 Java 활용하기
안녕하세요. 개발자 Stark입니다!저는 개발자가 된 후 지금까지 꾸준히 나만의 오픈소스 라이브러리를 만들고자 생각해 왔습니다. 이렇게 생각만 하던 중 갑자기 이런 생각이 들었습니다. "이렇게 오픈소스 만든다는 생각만 하다가 늙어 죽을 때까지 시도도 못해보고 똥 되겠다!"  시작하며위의 서론에서 이어집니다. 그래서 저는 바로 집에 가서 GPT를 켜고 이렇게 물어봤습니다. "내가 정말 멋진 오픈소스 프로젝트를 만들고 싶은데 어떻게 하면 될까?"이 질문에 대한 답변을 받은 순간 이런 생각이 들었습니다. 이제 최고의 두뇌이자 선생님인 AI가 있으니 Google에서도 원할만한 최고의 개발자가 되기 위해서는 '무언가를 만들고자 하는 본인의 강한 의지와 실행력'만 있으면 되는 게 아닐까?  왜냐하면 gpt에게 너무..
스프링 Enum 바인딩: 커스텀 Converter로 대소문자 문제 해결
·
Spring/Spring에서 Java 활용하기
안녕하세요 개발자 stark입니다! 오늘은 Enum을 우아하게 사용하는 방법을 소개드리고자 합니다. 스프링 MVC에서 @RequestParam이나 @PathVariable로 enum을 받을 때는 스프링 내부에서 StringToEnumConverter가 동작하게 됩니다. 그리고 이 Converter는 문자열과 enum 상수가 정확히 일치해야만 매핑됩니다. 그러나 개발을 하다 보면 소문자를 허용해야 할 수도 있고, 잘못 들어온 값에 대해 일관된 에러 메시지를 내려줄 필요도 있습니다. 이를 해결하기 위해 아래와 같이 커스텀 컨버터 + 전역 예외 처리를 구성하면, 원하는 대로 Enum을 바인딩하고 에러 응답을 깔끔하게 제어할 수 있습니다.  저도 이것을 잘 몰랐는데 제가 enum을 대문자로만 받도록 로직을 구성..
[Spring] 의존성과 결합도 제대로 알기
·
Spring/Spring에서 Java 활용하기
안녕하세요. 스프링 백엔드 개발자 stark입니다!백엔드 업무를 하면서 개발자들끼리 코드 구조에 대한 대화를 하다 보면 의존성과 결합도라는 용어를 정말 많이 사용합니다. 개발에서 얘기하는 의존성 그리고 결합도는 뭘 의미하는 걸까요? 이 궁금증을 해소하기 위해 이번 포스팅에서는 의존성과 결합도에 대해 가볍게 알아보고 의존성 주입(DI: Dependency Injection)을 통해 어떻게  높은 의존성을 풀어나가는지 알아봅시다.  의존성이란 무엇인가?의존성은 쉽게 말해 한 클래스가 다른 클래스의 기능에 의존한다는 것을 의미합니다. 예를 들어, OrderService 클래스가 주문 처리를 위해 PaymentService의 기능(메서드)을 필요로 한다면, OrderService 클래스는 PaymentServi..
[Java] Enum NPE 문제 빠르게 해결하기 (feat. equals, switch, AttributeConverter)
·
Spring/Spring에서 Java 활용하기
안녕하세요. 기록이 즐거운 개발자 stark입니다!이번 포스팅은 제가 직접 겪은 Enum 오류와 그 해결 과정을 기록해 두고자 작성했습니다. 스프링 프로젝트에서는 DB에 저장되는 타입을 문자열(String)이 아닌 Enum으로 관리하는 것을 권장합니다. Enum을 사용하면 임의의 값이 DB에 저장되는 것을 방지할 수 있으며, 코드 내에서 타입을 쉽게 검색해 빠르게 확인할 수 있는 장점이 있기 때문입니다. 하지만, Enum을 사용한다고 해서 문제가 없는 것은 아닙니다. 프로젝트를 진행하면서 예상치 못한 문제에 직면할 수 있습니다. 제가 겪은 문제 상황은 다음과 같습니다. 비즈니스 로직에서 Enum을 사용해 DB에 저장된 특정 타입 값을 확인하고, 일치할 경우 데이터를 처리하는 로직을 작성했습니다. 그러나,..
[Java] 메서드 추출(Extract Method)로 복잡한 비즈니스 로직 개선하기
·
Spring/Spring에서 Java 활용하기
안녕하세요. 자바 스프링 백엔드 개발자 stark입니다!실무에서 개발한 코드를 보면 비즈니스 로직이 엄청 긴 경우가 있습니다. 이 경우 내가 이렇게 열심히 작성했구나! 이런 뿌듯함을 느낄 수는 있지만 '근데 이거 뭘 작성한 거지?' 이런 생각이 들기도 합니다. 만약 작성한 코드 중간에 비즈니스가 추가되어 수정해야 하거나 개발 중에 잠깐 쉬다 와서 흐름을 잃었다면 '대체 내가 위에 어떤 비즈니스 코드를 작성했지?' 이런 생각이 들면서 모든 코드를 한 줄씩 다 천천히 읽어가며 이해해야 하는 상황이 발생합니다. 심지어 실무에선 내가 작성한 코드가 아닌데 수정해야 하는 경우도 정말 많기에 코드를 작성할 때부터 이해하기 쉽게 작성할 필요성이 있습니다. 그럼 어떻게 해야 우리가 작성한 코드가 읽기 쉬워질까요? 여러..
[Spring] synchronized를 사용한 동시성 문제 해결방법
·
Spring/Spring에서 Java 활용하기
개발중 동시성 문제를 해결하기 위해 lock을 걸곤 한다. 이때 synchronized를 잘못된 위치에 사용하면 lock이 제대로 걸리지 않으니 주의하자.📌 서론자바와 스프링으로 서버를 개발하다 보면 synchronized를 사용해서 lock을 걸어본 경험이 있을 것이다.또한 스프링 내부를 뜯어보다 보면 종종 synchronized를 사용한 코드들이 보인다. 나는 이것들에 대해 크게 신경 쓰지 않고 있었는데 이번에 인강으로 동시성 문제에 대한 공부를 하던 도중 새롭게 알게 된 사실이 있다. 바로 synchronized는 트랜잭션이 걸린 서비스 코드가 아닌 이 서비스 코드를 호출하는 컨트롤러에 걸어줘야만 동기화가 제대로 동작한다는 것이다.지금부터 코드를 통해 왜 서비스에서 synchronized를 적용시..
[Spring] StackTrace 상세분석 (예외처리)
·
Spring/Spring에서 Java 활용하기
예외가 발생하면 stackTrace는 어떻게 생성될까?📌 서론 RuntimeException이 발생했을 때 (우리가 주로 커스텀 예외를 만들 때도 RuntimeException을 던진다.)우리 개발자들은 예외가 발생하면 로그창에서 stackTrace 로그 내용을 분석하며 쉽게 오류사항을 찾아내곤 한다.스프링은 발생하는 예외를 어떻게 처리하고 stackTrace에 그 내용을 남기는 걸까?이번 포스트에서는 직접 RuntimeException 예외를 발생시키고 이 예외를 처리하는 코드를 따라가 보며 최종적으로 stackTrace를 만들어주는 코드를 분석해 보도록 하자. 이렇게 코드 분석을 따라가다 보면 알게 되는 점은 다음과 같을 것이다.1. RuntimeException은 어떻게 처리되는가 (예외처리 코드..
[Spring] 자바 리플렉션과 생성자 주입의 관계
·
Spring/Spring에서 Java 활용하기
이번 포스트에서는 Spring 프레임워크가 자바의 리플렉션 기능을 어떻게 활용하여 생성자 주입을 수행하는지에 대해 살펴보자 이번 포스트에서는 특히, 스프링의 AutowiredAnnotationBeanPostProcessor 클래스가 생성자 주입 과정에서 어떤 역할을 하는지 집중적으로 알아볼 것이다. 이 글에서는 리플렉션이 스프링 내부에서 어떻게 사용되는지에 집중하여 설명한다. 이를 통해, 스프링의 내부 동작 방식에 대한 더 깊은 이해를 얻을 수 있을 것이고 자바 리플렉션의 중요성도 알 수 있을 것이라고 생각한다. AutowiredAnnotationBeanPostProcessor 클래스는 아래와 같다. 스프링은 왜 리플렉션을 사용해서 의존성 주입을 할까? 1. 스프링이 리플렉션을 통해 하는 일은 무엇일까..