MongoDB는 NoSQL 데이터베이스로, 그 유연성 덕분에 Spring Boot와 자주 함께 사용됩니다. Spring Boot에서는 Spring Data MongoDB를 통해 MongoDB 연동을 쉽게 할 수 있습니다. Spring Data MongoDB는 두 가지 주요 방식을 제공합니다. 바로 MongoTemplate와 MongoRepository 입니다. 이번 포스팅에서는 이 두 가지 방법을 비교하고, 어떤 상황에서 각각을 사용하는 것이 좋은지 살펴보겠습니다. MongoRepository와 MongoTemplate[MongoRepository] MongoRepository는 레파지토리 패턴을 기반으로 한 인터페이스입니다. 기본적인 CRUD 메서드를 자동으로 제공합니다. Spring Data JPA와..
springboot
개발자로서 우리는 항상 생산성을 높이고 소프트웨어의 품질을 향상시킬 방법을 찾고 있습니다. 그리고 IDE를 마스터하는 것 - 단축키, 도구를 이해하는 것 - 이 여정의 중요한 부분입니다. 이 글에서는 IntelliJ IDEA 플러그인에 대해 다루겠습니다. 생산성을 극대화하고 코드를 완성도로 향상시킬 수 있는 5가지 무료 플러그인을 탐구해 보겠습니다. 1. Test Data 단위 테스트를 작성할 때, 샘플 데이터를 생성해야 하는 경우가 많습니다. 이 플러그인은 텍스트, UUID, 숫자, 날짜 및 시간, JSON, CSV, SQL과 같은 사용자 정의 형식을 포함한 다양한 무작위 데이터를 생성할 수 있는 작업을 추가합니다. Test Data - IntelliJ IDEs Plugin | MarketplaceTh..
Finally 블록에서 예외가 발생하면 어떻게 되나요? 자바에서, try-catch에서 finally 블록 내에서 예외가 발생할 때의 동작은, try-catch 블록의 예외 처리와 약간 다릅니다. [Try-Catch 블록의 예외] 정상적인 플로우가 중지됩니다. 예외 유형과 일치하는 catch 블록이 있다면, 해당 블록 내의 코드가 실행됩니다. 이를 통해 예외를 처리할 수 있습니다. catch 블록이 완료되거나 어떤 catch 블록과도 일치하지 않으면 finally 블록의 코드가 실행됩니다. [Finally 블록의 예외] 원래의 예외가 중지됩니다. 이는 원래의 예외가 메서드 호출자에게 전달되지 않는 것을 의미합니다. finally 블록에서 던진 예외가 호출자에게 전파되는 새로운 예외가 됩니다. [키 포인트..
Join은 무엇인가요? Join은 여러 테이블의 데이터를 결합하기 위한 개념입니다. 공유 field를 기반으로 서로 다른 테이블에서 관련 정보를 검색할 수 있습니다. 다음과 같은 데이터베이스가 있다고 가정합시다: 고객 테이블은 이름, ID와 같은 고객 정보를 저장합니다. 주문 테이블은 고객 ID(고객 테이블과 연결된)를 포함한 주문 정보를 저장합니다. 완전한 정보를 위해, 고객 정보를 주문 정보와 결합해 보여주길 원할 것입니다. 이때 조인을 사용합니다. 조인에는 여러 종류가 있습니다: Inner Join: 가장 일반적인 조인입니다. 두 테이블 모두에 포함된 내용만 반환합니다. Left Join: 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행이 포함됩니다. 일치하지 않는 오른쪽 테이블의 행은 nul..
HashMap은 내부에서 어떻게 동작하는가? HashMap은 Map 인터페이스의 해시테이블을 기반으로 한 구현입니다. 이 구현은 모든 map 연산을 제공하고, null 값과 null 키를 허용합니다. 이 클래스는 map의 순서를 보장하지 않습니다. Java HashMap은 null 키와 null 값을 허용합니다. HashMap은 순서가 지정된 컬렉션이 아닙니다. 키 집합을 통해 HashMap을 반복할 수는 있지만, HashMap에 추가되는 순서를 보장하지는 않습니다. HashMap은 비동기화되고 null 값을 허용한다는 점을 제외하면 Hashtable과 거의 유사합니다. HashMap은 맵 엔트리를 저장하기 위해 내부 클래스인 Node를 사용합니다. HashMap은 버킷 또는 빈(bin)이라고 불리는 여..
회사 프로젝트 중에 멀티모듈을 사용하는 레포가 있습니다. gradle 의존성을 정리하던 와중 공통 모듈의 의존성을 포함하지 못하는 이슈가 생겼습니다. 이번에는 해당 이슈를 트러블슈팅한 경험을 소개하겠습니다. 프로젝트 구조 프로젝트 구조는 다음과 같습니다. example-common이라는 이름의 공통 모듈이 하나, example-common을 import 하는 example-service 서비스가 있습니다. example-common (공통모듈) example-service (서비스) example-common 모듈의 build.gradle 내용은 다음과 같습니다. 전체는 아니고 일부만 가져왔습니다. dependencies { implementation 'org.elasticsearch.client:ela..
스프링 부트 애플리케이션인 lombok과 자바 14에서 출시된 새로운 기능인 record 클래스, 두 가지를 비교해 봅시다. 이 둘의 차이점과 어떤 것을 사용하는 것이 더 나은지 논의하기 전에, record와 lombok에 대해 간단하게 알아보겠습니다. Project Lombok Lombok은 에디터와 빌드 도구에 자동으로 연결되어 자바 개발 속도를 높여주는 자바 라이브러리입니다. getter와 equals 메서드를 작성할 필요가 없습니다. 어노테이션 하나만 추가하면 완전한 기능을 추가할 수 있으니까요. 자바로 개발하면서 매번 클래스에 getter/setter를 선언하는 것은 매우 고통스러운 일이었습니다. 새로운 클래스가 생성될 때마다 모든 빈에 대해 동일한 단계를 추가하는 것은 나쁜 디자인일 겁니다. ..
테이블과 매핑되는 엔티티를 정의할 때는 Id 값이 필수로 들어갑니다. 우리는 주로 Long 타입으로 정의를 하곤 합니다. 근데 왜 Wrapper 타입인 Long을 사용하는 걸까요? Primitive 타입인 long 도 있는데, 이것을 사용하면 안 되는 걸까요? 분명히 어떤 이유가 있을 겁니다. 그러려면 우선 Primitive와 Wrapper의 차이점 부터 알아보아야겠습니다. Primitive Type vs. Reference Type 우선 자바의 변수 타입에는 기본형(Primitive Type)과 참조형(Reference Type)이 있습니다. int age = 3; // 기본형 Point p1 = new Point(5, 4);// 참조형 두 개의 차이점은, 기본형은 변수의 값을 그대로 저장하지만 참조형..