[Spring Cloud MSA] Config, Gateway, Eureka까지 MSA 핵심 구조 쉽게 이해하기
·
BackEnd/Spring & JPA
마이크로서비스 아키텍처(MSA, Microservice Architecture)를 처음 접했을 때, 여러 개의 서비스가 어떻게 서로를 찾고 통신하는지 궁금하지 않으셨나요?"수십 개의 서비스가 있는데, 클라이언트는 이걸 어떻게 호출하지?""매번 설정 파일을 서비스마다 일일이 고쳐야 하나?""서비스 IP가 바뀌면 호출은 어떻게 하지?"이러한 고민들을 해결하기 위해 등장한 것이 바로 Spring Cloud입니다.Spring Cloud는 마이크로서비스 환경에서 반복적으로 발생하는 문제들을 자동화하고 추상화하여 보다 쉽게 시스템을 구축할 수 있게 도와주는 도구입니다.이번 글에서는 Spring Cloud의 개념을 먼저 알아보고, 실무에서 자주 사용하는 핵심 구성 요소들인API GatewayConfig ServerS..
[Java] String은 왜 불변(Immutable)할까? String Pool, intern(), 생성 방식까지 완벽 정리
·
BackEnd/JAVA
자바에서 문자열을 다룰 때 가장 많이 사용하는 타입은 단연 String입니다. 하지만 여러분은 다음과 같은 코드에서 의문을 가져본 적 없으신가요?String s1 = "Cat";String s2 = "Cat";String s3 = new String("Cat");System.out.println(s1 == s2); // trueSystem.out.println(s1 == s3); // false위 코드에서 s1 == s2는 true이고 s1 == s3는 false라는 결과가 나옵니다. 도대체 무슨 일이 일어난 걸까요?이번 글에서는 Java에서 String이 어떻게 동작하고, 왜 불변(Immutable)하게 설계되었는지, 그리고 메모리 구조, 성능, 보안 측면에서 어떤 이점이 있는지 하나씩 정리해보겠습니다..
[Spring Boot] MySQL Master/Slave 복제 설정과 Read/Write 자동 분기 처리 방법 정리
·
BackEnd/Spring & JPA
1. 시작하며사이드 프로젝트를 운영하면서 현재는 단일 데이터베이스만 사용 중이었습니다. 단순한 개인 프로젝트 수준이라면 큰 무리는 없겠지만, 운영 환경에서 안정성과 확장성을 확보하려면 최소한의 DB 이중화 구조는 반드시 필요하다는 생각이 들었습니다.특히, 현재 운영 중인 프로젝트는 전체 쿼리 중 약 80~90%가 읽기(Read) 작업으로 이루어져 있기 때문에, 읽기/쓰기 분리 구조를 미리 연습해보는 것만으로도 큰 도움이 되겠다는 판단이 들었습니다.물론 단일 DB로도 운영은 가능하지만, 실무에서는 장애 대응, 확장성, 성능 분산 등의 이유로 Master/Slave 구조(Master-Replica)를 도입하는 경우가 많습니다.이에 따라, MySQL Master/Slave Replication 구조를 설정하고..
[JAVA] equals()와 hashCode() 완벽 정리
·
BackEnd/JAVA
자바에서 객체의 동등성 검사는 매우 중요한 개념이며, 이를 위해 equals()와 hashCode() 메서드를 올바르게 이해하고 구현하는 것이 필수적입니다.equals() : 두 객체가 논리적으로 같은지 비교하는 메서드hashCode() : 객체를 빠르게 찾을 수 있도록 해시값(정수)를 반환하는 메서드이 글에서는 equals()와 hashCode()의 개념, 원칙, 구현 방법, 컬렉션과의 관계, 그리고 실무에서의 활용까지 완벽하게 정리해보겠습니다.1. eqauls()와 hashCode()란?1.1 equals()란?equals()는 두 객체가 논리적으로 같은지 판단하는 메서드입니다.Object 클래스의 기본 equals()는 == 연산자와 동일하게 참조(주소) 비교를 수행합니다.따라서 equals()를 ..
[JAVA] 익명 클래스 (Anonymous Class) 정리
·
BackEnd/JAVA
자바에서는 클래스를 선언하고 객체를 생성하는 것이 일반적이지만, 일회성으로만 사용할 객체라면 굳이 클래스를 따로 선언하는 것은 불필요할 수 있습니다.이때 익명 클래스(Anonymous Class)를 사용하면 클래스를 선언하지 않고도 객체를 즉시 생성할 수 있어 코드를 간결하게 유지하고 유지보수를 쉽게 만들 수 있습니다.이번 글에서는 익명 클래스의 개념, 특징, 활용 방법, 주의할 점, 그리고 람다 표현식과의 차이점까지 완벽하게 정리해보겠습니다.1. 익명 클래스 (Anonymous Class)란?익명 클래스(Anonymous Class)란 이름이 없는 내부 클래스로, 특정 인터페이스를 구현하거나 클래스를 상속하여 일회성으로 사용할 객체를 즉석에서 생성하는 데 사용됩니다.일반적으로 클래스를 선언하고 객체를 ..
[JAVA] Lombok의 @UtilityClass 어노테이션 정리
·
BackEnd/JAVA
자바를 개발하다 보면 Math, Collections 같은 유틸리티 클래스를 만들 일이 많습니다. 일반적으로 유틸리티 클래스는 정적(static) 메서드만 포함하며, 객체로 생성할 필요가 없습니다.Lombok에서는 이러한 유틸리티 클래스를 간편하게 정의할 수 있도록 @UtilityClass 어노테이션을 제공하며, 이를 통해 자동으로 인스턴스 생성을 막고 모든 멤버를 static으로 변환할 수 있습니다.이번 포스팅에서는 @UtilityClass의 개념과 사용법, 컴파일 후 코드 변환 과정, 그리고 유틸리티 클래스 설계 시 고려해야 할 점들을 정리해보겠습니다.1. @UtilityClass란?@UtilityClass는 Lombok v1.16.2에서 도입된 어노테이션으로, 객체 생성이 불필요한 유틸리티 클래스를..
[Spring] @RequestPart를 활용하여 JSON + MultipartFile 동시 전송하기 (Feat. 게시판에서 게시물 생성과 첨부 파일 업로드 한번에 처리하기)
·
BackEnd/Spring & JPA
1. 시작하며웹 애플리케이션을 개발할 때, JSON 데이터와 파일을 함께 전송해야 하는 경우가 있습니다.예를 들어, 게시글 작성 시 게시글 정보(JSON)와 첨부파일(MultipartFile)을 함께 API에 전달해야 하는 경우를 생각해 볼 수 있습니다.보통 API에서 @RequestBody를 사용하여 JSON 데이터를 받지만, multipart/form-data 요청에서는 @RequestBody를 사용할 수 없습니다.이러한 경우, Spring의 @RequestPart 어노테이션을 활용하면 JSON과 파일을 동시에 전송할 수 있습니다.이 글에서는@RequestBody와 @RequestPart의 차이점@RequestPart를 활용하여 게시글 정보(JSON) + 첨부파일을 한 번의 요청으로 처리하는 방법프론..
[JAVA] 얕은 복사 (Shallow Copy) VS 깊은 복사 (Deep Copy)
·
BackEnd/JAVA
자바에서 객체를 복사하는 방법은 크게 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)로 나뉩니다. 이 둘은 객체의 참조 관계를 다르게 처리하므로 상황에 따라 신중하게 사용해야 합니다.1. 얕은 복사 (Shallow Copy)란?얕은 복사는 객체의 참조 값(주소)만을 복사합니다. 즉, 복사된 객체와 원본 객체는 동일한 참조를 공유하게 됩니다. 복사된 객체를 통해 변경이 이루어지면 원본 객체에도 영향을 미칩니다.얕은 복사 관련 예시 코드class User { private String name; public User(String name) { this.name = name; } public void setName(String name) { t..
[JAVA] 와일드카드 (Generic Wildcards) 정리
·
BackEnd/JAVA
1. 와일드카드 (Generics Wildcards)란?와일드카드(Wildcards)는 제네릭 타입을 더욱 유연하게 처리하기 위한 기능입니다.?(물음표) 기호를 사용하여 타입을 특정하지 않고 여러 타입을 다룰 수 있도록 합니다.주로 제네릭 메서드의 매개변수에서 사용되며, 타입의 상속 관계를 활용하는 데 유용합니다.와일드카드를 사용하면 다양한 타입을 처리하는 메서드를 더욱 유연하게 작성할 수 있습니다.1.1 와일드카드가 필요한 이유제네릭을 사용하다 보면 단일한 타입이 아니라, 여러 타입을 동시에 처리해야 할 경우가 종종 발생합니다. 예를 들어, 컬렉션 같은 자료구조에서 다양한 타입의 데이터를 처리하고자 할 때, 구체적인 타입을 지정하지 않고 타입 간의 상속 관계를 이용하고 싶을 때가 있습니다.제네릭을 사용..
[JAVA] 제네릭 (Generic) 정리
·
BackEnd/JAVA
1. 제네릭 (Generic)이란?제네릭(Generic)은 컴파일 시 타입 체크를 강화하여 타입 안전성을 제공하는 자바의 기능입니다. 제네릭을 사용하면 클래스, 인터페이스, 메서드가 다양한 타입을 처리할 수 있게 됩니다. 이를 통해 코드의 재사용성을 높이고, 잘못된 타입 사용을 컴파일 시점에서 방지할 수 있습니다.정리하면, 타입을 유연하게 처리하며, 잘못된 타입 사용으로 발생할 수 있는 런타임 타입 에러를 컴파일 과정에서 검출하기 위해 사용하는 기능입니다.1.1 제네릭의 필요성1) 제네릭 도입 이전 문제제네릭이 도입되기 전에는, 모든 타입을 담을 수 있는 Object 타입을 이용하여 데이터를 처리했습니다. 컬렉션 예시로, ArrayList 같은 자료 구조에 타입 제한이 없었고, 어떤 객체든 추가할 수 있..