[스프링부트] 하나의 인터페이스로 여러 구현체 선택 방법
·
Java
@ SpringBoot@ JDK 21 의존성 역전에서 인터페이스의 구현체가 여러 개인 경우가 종종 발생합니다. 예를 들어, DBMS로 MySQL과 PostgreSQL을 동시에 사용하는 상황에서 구현체를 선택하고 구별하여 로직을 처리하는 방법을 고민할 필요가 있습니다.아래에서 대표적인 접근 방법들을 정리했습니다. 1. 비권장 방식: instanceof 및 명시적 타입 변환if (orderWriter instanceof MySqlOrderAdapter mysql) { mysql.saveMySqlWay(...);}단점Open-Closed Principle(OCP) 위반인터페이스를 사용한 추상화가 무의미해짐확장 시 if 조건문이 늘어나 유지보수 어려움2. 권장 방식: 스프링 DI + Qualifier, P..
[Java] record는 뭐야?
·
Java
record 등장 ?!❓Java 14에 처음 등장❗️Java 16부터 정식✅ Java 21에서 거의 주력으로 자리잡은 record. record에서 간략하게 알아보자.setter ❌getter, 생성자, equals, hashCode, toString 자동생성final 필드로 수정 ❌ (불변객체)직렬화 가능Swagger 문서화 도구 사용 가능 ✅ 겉으로 보이는 차이점: 일반 객체(DTO)와 record 비교일반 객체(DTO)와 비교해보자.생성자명시적으로 작성해야 함자동 생성 (canonical constructor)getter직접 생성 or Lombok 필요자동 생성setter직접 생성 or Lombok 필요❌ 없음 (불변)equals/hashCode/toString수동 or Lombok 필요자동 생성필..
REST API에서 요청 DTO를 매번 만들어야 하나?
·
Java
@ SpringBoot@ JDK 21 REST API에서 요청 DTO를 매번 만들어야 하나?왜 요청 DTO를 쓰는가?REST API를 처음 설계할 때, 객체를 남발하는 느낌과 굳이 필요한가? 만약, 하나의 요청값만 있다면 너무 too much 아닌가? 라는 생각이 들었다. 다만, 결론만 생각해본다면 DTO는 많은게 맞고, 그만큼 얻는게 많다는 것이다.도메인을 외부 API에 노출하지 않는다.(API 안정성 증가)도메인과 분리되어 결합도를 낮춰 개발 영향도가 적다.    DTO 클래스에 검증 어노테이션 등을 사용해서 간결하게 처리 가능하다.위 내용을 토대로 유지 보수 관점에서도 좋다. 그래도 너무 많고 아무리 DTO를 권장해도 파일이 너무 많거나 정리를 못하여 복잡해진다면대안법으로 사용할 만한 방법이 몇가지..
REST API 설계, GET 방식과 보안이슈
·
Java
@ 스프링부트 기반@ JDK 21왜? GET은 JSON 처리가 된 않을까?처음 REST API를 접했을 때, 모든 입출력값은 `JSON`으로 처리할 줄 알았습니다.그러나, GET 방식에서는 JSON Body를 사용하지 않는게 표준입니다.GET 요청은 원칙적으로 웹 요청에 본문(body)를 사용하지 않습니다.GET 요청은 QueryString를 통해 데이터를 전달합니다.( ?value=1 )본문(body)은 거의 사용하지 않으며, 개부분 클라이언트나 프록시가 GET body를 무시하거나 막습니다.따라서 JSON 데이터를 통째로 전달하려면 POST/PUT/PATCH 같은 메서드를 사용하게 일반적입니다.보안? 표현력의 트레이드오프 조회인데 POST를 써야 하나?  처음 REST 설계를 할때 자주 부딪히는 보안..
Java 버전별 변천사 ( Java 6 ~ )
·
Java
Java는 오랜 시간 동안 발전을 거듭해 왔습니다. 처음에는 단순한 객체지향 언어였지만, 점점 더 강력한 기능을 갖추면서 다양한 환경에서 활용될 수 있도록 변화해 왔습니다. 특히 LTS(Long-Term Support) 버전은 기업에서 안정적으로 사용할 수 있도록 지원됩니다. 이 글에서는 Java 6부터 주요 변화를 실제 개발 과정에서 마주할 수 있는 이야기로 풀어보겠습니다.1. Java 6 ~  주요 변화 한눈에 보기버전출시주요변화추가된 이유이후 발전Java 6(2006)JVM 성능 개선웹 서비스 강화실행 속도 향상기업용 웹 서비스 지원RESTful API 발전Java EE → Jakarta EE 변경Java 7(2011)코드 가독성 향상병렬 처리 지원멀티코어 환경 증가예외 처리 개선Java 8의 St..
TDD 시나리오 OOP 적용 예시
·
SW 방법론
시리즈2025.03.06 - [SW 방법론] - 테스트 주도 개발(TDD: Test Driven Development)2025.03.13 - [SW 방법론] - TDD 시나리오 OOP 적용 예시1. 테스트 시나리오TDD 기반으로 진행하는 동물 추상화 문제를 어떻게 풀어갈지 순차적으로 정리해 보겠습니다.TDD의 red, green, refactor 방식으로 나누어 순차적으로 진행됩니다.또한, OOP의 4가지 특징(추상화, 다형성, 상속, 캡슐화)을 적용하여 코드를 구체화할 것입니다.1️⃣ 동물 추상화 정의 (Animal 추상 클래스)Red:추상 Animal 클래스와 각 동물 객체의 move 메소드를 정의할 테스트 케이스 작성.동물마다 다른 동작할 수 있도록 다형성 구현빨간 물결줄이 객체와 메소드에 표시 된..
자바의 특징
·
Java
1. 플랫폼 독립성바이트코드 형태로 변환된 후 JVM(Java Virtual Machine)에서 실행되므로, OS와 상관 없이 동작할 수 있다.바이트코드는 xxx.java 파일을 컴파일한 xxx.class 형태의 클래스 파일이다. 이게 왜 특징이냐?라고 생각이 들텐데?! 자바 이전의 언어 소스들은 각 언어 체계에 따라 컴파일러가 있고 컴파일러를 통해 어셈블리어로 변환 한다.변환된 어셈블리어를 기계가 읽을 수 있게 어셈블러를 통해 기계어로 변환하여 하드웨어가 읽은 수 있게된다. 여기서 기존의 소스 코드 공유 방식에서 자바와 차이가 나타난다. 하드웨어, 제조사마다 기계어의 설계가 다르다는 것이다.예를 들어, A라는 장비에 B 운영체제에서 C언어로 개발한 소스(C)가 있다.이 소스를 A'라는 장비에 B' 운영..
클래스 초기화 순서
·
Java
문득, JVM구조를 공부하다가 초기화 순서가 정확히 어떻게 진행 될까? 생각해본적이 있다.언제 초기화 되는걸까?인스턴스를 생성할 때(new 객체 생성)클래스의 정적 메소드를 호출할 때 클래스가 초기화됨클래스의 정적 변수 값이 할당되거나 사용될 때초기화 순서는?정적 변수 초기화필드가 선언된 순서대로 초기화정적 블록 실행static {}간혹 정적 블록이 먼저 실행될 수도 있음인스턴스 변수 초기화인스턴스 변수가 선언된 순서대로 초기화됨인스턴스 블록 초기화{}생성자 실행예제class Example { static int staticVar = initializeStaticVar(); static { System.out.println("정적 블록 실행"); } int instanc..
웹 응답값 유지가 되는 방법
·
웹(WEB)
1. 상황리액트를 사용중이며 API로 응답값을 받은 이후, API 서버가 죽은 상태에서도 값이 그대로 남아 있는 현상2. 원인1. React 상태(state)에 데이터가 남아 있음API 호출 후 응답 데이터를 useState로 저장하면, API 서버가 죽어도 상태값이 유지되므로 화면에는 기존 데이터가 계속 표시됨.해결 방법: API 호출 실패 시 상태를 초기화하거나, 화면에서 데이터를 숨기는 로직 추가.const [data, setData] = useState(null); useEffect(() => { axios.get('/api/data') .then(res => setData(res.data)) .catch(() => setData(null)); // 에러 발생 시 상태 초기화..
덱(Deque) 보다 큐(Queue)와 스택(Stack)이 더 좋은 경우?
·
Java/자료구조
시리즈2025.03.11 - [Java/자료구조] - 스택? 큐?2025.03.11 - [Java/자료구조] - Deque?2025.03.11 - [Java/자료구조] - 덱(Deque) 보다 큐(Queue)와 스택(Stack)이 더 좋은 경우?자바 기반 설명이며 개념에 관한 내용을 다룹니다.📌 핵심내용