Backend 57

OpenFeign: MSA 서비스 간 통신

📌MSA에서의 HTTP 클라이언트 사용MSA 환경에서는 각 서비스가 독립적으로 동작하며, 서로의 API를 호출해야 한다. 이때 다양한 HTTP 클라이언트를 사용할 수 있으며, 성능과 유지보수를 고려해 적절한 방식을 선택해야 한다. ✅ HTTP 클라이언트는 MSA에서만 사용할까?➡️ 아니다! 일반적인 모놀리식 아키텍처에서도 다른 외부 API 호출을 위해 HTTP 클라이언트를 사용한다.➡️ 하지만 MSA에서는 서비스 간 통신이 필수적이므로, OpenFeign 같은 라이브러리가 특히 많이 사용된다. ✅ 일반적인 API 호출과의 차이점은?➡️ 보통 API 호출은 단순한 HTTP 요청이지만, MSA에서는 더 세밀한 HTTP 클라이언트 설정이 필요하다.서비스 디스커버리(Eureka) 를 이용한 동적 URL 매핑로..

JPA vs MyBatis

JPA와 MyBatis는 Java 애플리케이션에서 데이터베이스와 통신하기 위한 대표적인 persistence 프레임워크로, 각각 자동화된 ORM 방식(JPA)과 SQL 중심의 매퍼 방식(MyBatis)을 제공한다. 🔥 JPA vs MyBatis 비교✔ JPA는 객체 중심 설계와 생산성 강화에 좋음✔ MyBatis는 SQL 최적화와 복잡한 쿼리에 강점✔ 대부분의 프로젝트는 JPA + QueryDSL을 기본으로 사용하면서, 성능이 중요한 부분만 MyBatis로 처리!비교 항목🏆 JPA (Hibernate, Spring Data JPA)🔥 MyBatis개발 생산성✅자동 매핑, CRUD 자동 생성 → 생산성 높음❌SQL 직접 작성 필요 → 생산성 낮음SQL 최적화❌복잡한 쿼리는 어렵고 성능 튜닝 필요 ✅S..

Backend/JAVA 2025.04.10

Elasticsearch란?

📌 1. Elasticsearch란?Elasticsearch는 분산 검색 및 분석 엔진으로, 대규모 데이터를 빠르게 검색하고 분석하는 데 최적화된 시스템!!검색, 로그 수집, 데이터 분석 등의 용도로 사용된다. ✅ 1-1. Elasticsearch의 주요 개념인덱스(Index)데이터를 검색하기 위해 구성된 기본적인 저장 단위. 각 인덱스는 문서(document)의 집합으로 구성, 이 문서들은 JSON 형식으로 저장된다.샤드(Shard)와 레플리카(Replica)Elasticsearch는 데이터를 샤드(shard)로 나누어 여러 서버에 분산 저장, 이를 레플리카(replica)로 복제하여 고가용성을 보장한다.검색 및 분석사용자는 검색 쿼리를 통해 데이터를 빠르게 찾고, 분석할 수 있다.  전체 텍스트 검..

데이터 통합 조회 방법 설계

📌 문제MSA에서는 각 서비스가 독립적으로 DB를 관리하기 때문에, 한 서비스에서 다른 서비스의 데이터를 직접적으로 조회할 수 없다.예를 들어, 주문 목록을 조회할 때, 주문 아이템정보 제공을 위해 상품 정보를 JOIN으로 가져오지 못 하고 주문 아이템 마다 상품 서비스에 요청을 보내야 한다.이 과정에서 여러 번의 API 호출이 발생하기에 성능 저하 우려가 있었다. 📌 방법 비교✅ 1. 주문 아이템마다 상품 API 호출주문 1개 → 주문 아이템1개 마다 상품 서비스 API를 호출하여 상품 정보를 받아오고 이를 합친다.✔ 장점간단하고 직관적인 방식❌ 단점주문마다 상품 정보를 별도로 API 호출하기 때문에 네트워크 요청이 많아져 성능이 저하될 수 있음. ✅ 2. 캐시(redis)를 이용해 주문 정보 저장..

MSA 환경에서 인증/토큰 재요청

📌 문제JWT 토큰이 만료되었을 때 다시 요청을 처리하는 방법은 Refresh Token을 활용한 재발급 방식이 일반적이다.예를 들어, 게시글 작성 중 토큰이 만료 되었을 때는 사용자가 재로그인/수동 로그인 시간 연장 하지 않고 refresh 처리가 되어야 한다!!✅ 1. MSA 환경에서 JWT 인증 흐름1️⃣ 사용자 로그인 → 인증 서버(Auth Service)에서 JWT 액세스 토큰과 리프레시 토큰 발급액세스 토큰: 비교적 짧은 만료 시간 (예: 30분~1시간)리프레시 토큰: 비교적 긴 만료 시간 (예: 7일~30일)클라이언트는 액세스 토큰을 HTTP 헤더에 포함하여 API 요청2️⃣ 게이트웨이(API Gateway)에서 JWT 토큰 검증 후 해당 마이크로서비스(Post Service 등)로 요청 ..

환경 변수 관리 (@Value, @ConfigurationProperties)

🔍 1. 환경 변수란? YAML 변수, 프로퍼티 변수, 설정 변수 라고도 부른다.환경 변수는 애플리케이션 실행 시 필요한 설정 값을 의미한다.이를 통해 코드 수정 없이 환경을 변경할 수 있고, 유지보수도 쉬워진다! 📌 2. 환경 변수 설정하기Spring Boot에서는 환경 변수를 application.yml 또는 application.properties에 저장한다. ➡️ 이 값들은 @Value나 @ConfigurationProperties를 사용해서 코드에서 가져올 수 있다!   📖 YAML 사용 (application.yml)atchfile: upload: path: /upload/files  📖 Properties 사용 (application.properties)atchfile.uplo..

Backend/spring 2025.02.26

[JAVA] 데이터 타입 Primitive Type vs Wrapped Type

📌 1. 자바의 데이터 타입 분류Wrapped Type을 알기 전에 Reference Type에 대해 먼저 알아보자.자바에서 데이터 타입은 크게 두 가지로 나뉜다! 1️⃣ 기본형(Primitive Type) → 값 자체를 저장2️⃣ 참조형(Reference Type) → 객체를 가리키는 참조값을 저장 ✅ 1. 기본형 (Primitive Type)boolean, char, byte, short, int, long, float, double객체가 아니며, 메모리에서 직접 값을 저장연산 속도가 빠르고 메모리 사용이 효율적✅ 2. 참조형 (Reference Type)배열(int[]), 클래스(String, Integer, Double 등), 인터페이스, 열거형(Enum)객체의 주소(참조값)를 저장메서드를 사용..

Backend/JAVA 2025.02.26

static 키워드

📌 1. static 키워드의 의미static은 "정적인"이라는 의미로,  static을 붙이면 객체(instance)와 관계없이 클래스(class) 단위로 관리된다는 뜻이다! 즉, 클래스가 메모리에 로드될 때 한 번만 생성되며, 모든 객체가 공유한다. ✅ 2. static 키워드의 사용1️⃣ static 변수 (클래스 변수)모든 객체가 공유하는 변수! (인스턴스와 관계 없음)클래스명.변수명으로 접근 가능객체를 생성하지 않아도 사용 가능📖 예제class Counter { static int count = 0; // 모든 객체가 공유하는 변수 Counter() { count++; // 생성될 때마다 count 증가 }}public class Main { public s..

Backend/JAVA 2025.02.26

JNDI란?

🔍 JNDI란? (Java Naming and Directory Interface) Java EE에서 사용되는 네이밍 서비스로, 리소스 (DataSource, JMS 등)를 애플리케이션에서 쉽게 찾고 사용할 수 있도록 도와줌.✅ 1. 기본 개념DataSource데이터베이스 연결을 관리하는 객체로, 직접 DriverManager.getConnection()을 사용하는 대신 JNDI를 통해 제공됨.Connection pool을 어플리케이션단에서 어떻게 관리할지를 구현하는 인터페이스  ⭐DriverManager.getConnection():실제 자바 프로그램과 데이터베이스를 네트워크상에서 연결해주는 메소드이다. Connection: 네트워크 상의 연결 자체를 의미 Connection Pool (커넥션 풀):..

Backend/JAVA 2025.02.26

[error] java.lang.IllegalArgumentException: Name for argument of type [int] not specified

🚨 Name for argument of type [int] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag. java.lang.IllegalArgumentException: Name for argument of type [int] not specified Ensure that the compiler uses the '-parameters' flag. This application has no explicit mapping for /error, so you are seeing this as a fallback.Wed Fe..

Backend/spring 2025.02.23