Java & Spring Boot

데이터 무결성을 관리하는 데 있어서 트랜잭션 매니저는 자바 애플리케이션에서 매우 중요한 역할을 합니다. 이번 포스팅에서는 자바의 기본 트랜잭션 매니저 인터페이스와 그 구현체들을 알아보겠습니다. 트랜잭션 매니저란? 트랜잭션 매니저는 여러 데이터베이스 작업이 하나로 묶일 수 있도록 관리해주는 구성 요소입니다. 이는 모든 작업이 성공적으로 완료되거나, 하나라도 실패할 경우 전체 작업을 원상태로 되돌리는 'All or Nothing'의 원칙을 보장합니다. 자바에서는 주로 JTA(Java Transaction API)를 이용하여 트랜잭션을 관리합니다. 스프링과 트랜잭션 매니저 스프링 프레임워크에서는 더 편리하게 트랜잭션을 관리할 수 있는 추상화된 트랜잭션 매니저를 제공합니다. PlatformTransactionM..
회사 프로젝트 중에 멀티모듈을 사용하는 레포가 있습니다. gradle 의존성을 정리하던 와중 공통 모듈의 의존성을 포함하지 못하는 이슈가 생겼습니다. 이번에는 해당 이슈를 트러블슈팅한 경험을 소개하겠습니다. 프로젝트 구조 프로젝트 구조는 다음과 같습니다. example-common이라는 이름의 공통 모듈이 하나, example-common을 import 하는 example-service 서비스가 있습니다. example-common (공통모듈) example-service (서비스) example-common 모듈의 build.gradle 내용은 다음과 같습니다. 전체는 아니고 일부만 가져왔습니다. dependencies { implementation 'org.elasticsearch.client:ela..
자바 언어로 개발하다 보면, 다양한 어노테이션을 활용할 때가 많습니다. 도대체 내부가 어떻게 되어있는지 궁금해서 들어가 보면, 알 수 없는 이상한 코드들과 마주칩니다. 어노테이션을 직접 생성하거나 유심히 공부해보지 않았다면 처음 보는 코드가 많을 겁니다. 비교적 자주 사용하는 @Getter 어노테이션인데도, 내부를 까보면 마치 외계어처럼 낯설기만 합니다. 이번 포스팅에서는 어노테이션이 무엇인지, 종류에는 어떤 것이 있는지, 그리고 샘플 코드를 통해 어노테이션을 조금 더 깊게 알아봅시다. 끝에는 이 낯선 @Getter 코드도 조금은 이해할 수 있을 것입니다. 어노테이션이란? 어노테이션이란 과연 무엇일까요? 단순히 앞에 골뱅이(@) 기호를 붙인 것일까요? 사용법으로는 맞지만, 우리가 원하는 어노테이션의 정의..
코딩을 하다 보면, 정말 수많은 예외와 마주치게 됩니다. 그러나 예외에는 어떤 종류가 있는지, 어떤 상황에서 예외가 발생하는지 자세히 들여다볼 기회가 없었습니다. 이번 포스팅에서는, 자바 예외의 종류와 각각 어떤 Exception이 속해 있는지 알아봅시다. 3가지 예외 자바 예외는 크게 3가지 유형으로 나누어집니다. Checked Exception: 명시적으로 처리해야 하는 예외 (IOException, FileNotFoundException 등) Unchecked Exception: RuntimeException 상속. 명시적인 예외 처리를 강제하지 않음 (NullPointerException 등) Error: 시스템에 비정상적인 상황이 발생한 경우 (StackOverflowError 등) 쉽게 설명하..
프로그래밍에서 공통적인 문제를 쉽게 해결하기 위해 만들어진 가이드라인을 디자인 패턴(Design Pattern)이라고 합니다. 라이브러리처럼 실제 코드를 제공하지는 않지만, 특정 유형의 문제를 해결하는 방식을 제공합니다. 수학으로 비유해 보자면 '공식'이죠. 프로그래밍 전문가들의 땀과 눈물로 만들어진 결과물이라고 할 수 있겠습니다. 디자인 패턴으로 잘 알려진 감마 외 3인(Gang of Four, GoF)이 쓴 디자인 패턴 책에서는 23가지 기본 디자인 패턴을 소개하고 있습니다. 그러나 이번 포스팅에서는 주로 사용되는 싱글톤, 빌더, 옵저버 패턴에 대해 알아보겠습니다. 왜 디자인 패턴이 필요한가? 1. 재사용성: 디자인 패턴을 사용함으로써 개발자는 문제가 발생할 때마다 코드를 다시 구현하는 대신 기존 솔..
스프링 프로젝트를 진행하다 보면, 우연히 두 개 이상의 빈(bean) 타입이 중복되는 경우가 발생할 수 있습니다. 이런 경우에는 NoUniqueBeanDefinitionException 에러가 발생하여 어떠한 빈이 중복되었는지 알려줍니다. ! 문제 상황 발생 ! 그렇다면, 해당 에러가 발생했을 때는 어떠한 해결책이 있을까요? 우선 문제가 발생하는 상황의 예시를 봅시다. 같은 타입의 이름이 다른 두 개의 빈을 등록하였습니다. 등록할 때는 문제가 되지 않습니다. 에러가 발생하는 것은 실제로 해당 타입의 빈이 사용이 될 때입니다. 다음 예제를 볼까요? 스프링 부트 입장에서는 참 난감합니다. 같은 타입의 빈이 두 개가 있는데, 어떤 의존성을 주입하라는 건지 알 수가 없습니다. 불쌍한 스프링 부트를 위해 이 에러..
다 사용하고 난 자원을 반납하기 위해서 어떤 방법을 채택하시나요? 혹시, try-catch-finally 구문을 사용하지는 않으신가요? 맞다면, 축하드립니다! 더 간편한 방법을 사용할 수 있는 기회를 잡으셨습니다! try-catch-finally를 사용한다면 사용 후에 반납해야 하는 자원들은, 대부분 close 형태의 메서드를 가지고 있습니다. 사용 후에 자원을 해제하지 않는다면, 메모리 누수 및 성능 저하의 문제를 일으킬 수 있기 때문에 프로그램이 예상과 다르게 작동할 수 있습니다. 그렇다면 이제, 흔히 사용하는 try-catch-finally 형태의 자원 해제 예시를 살펴볼까요? 어떤가요? 꽤 괜찮아 보이지 않나요? 예외 처리가 발생하든 안하든 상관 없이 항상 자원을 해제할 수 있으니, 나쁘지 않아 ..
자바로 코딩을 하다 보면, 가끔 "Raw type을 사용하지 마라"라는 조언을 듣습니다. 실제로 Effective Java에서도 언급합니다. 그렇다면 Raw type은 무엇이고, 왜 사용하지 않는 것이 좋을까요? Raw type에 대해 알아보려면 우선 Generic type이 무엇인지 알아야합니다. Generic type 이란? Generic 이란 generalize(일반화하다)를 변형시킨 단어로 보입니다. 그래서 '데이터의 타입을 일반화하다' 로 뜻을 유추할 수 있습니다. 클래스와 인터페이스, 메서드를 정의할 때 타입을 지정하지 않고 파라미터로 사용할 수 있게 만듭니다. 이해가 안 된다면 아래 예시를 봅시다. 같은 Box 클래스를 사용하고 있지만, String, Integer, Boolean의 다양한 ..
Spring Boot를 사용하면 대부분 사람들이 가장 먼저 배우는 MVC 패턴! 가장 기초적인 패턴이라 인터뷰 질문에 많이 나오기도 합니다. 오늘은 그 MVC 패턴에 대해서 알아보도록 하겠습니다. MVC 패턴의 구조 동작 방식은 간단합니다. 쉽게 설명하기 위해 학생이 과제 게시판을 보고 싶다고 가정하겠습니다. 1. 학생이 컨트롤러에게 과제 게시판 조회를 요청한다. 2. 컨트롤러는 모델에게 과제 게시판 데이터들을 달라고 요청한다. 3. 모델은 가져온 데이터들을 컨트롤러에게 전달해 준다. 4. 컨트롤러는 가져온 데이터들로 뷰를 만들어서 사용자에게 UI로 전달해준다. 여기서 나오는 컨트롤러, 모델, 뷰가 바로 MVC의 Model, View, Controller 입니다. 예시에서 파악할 수 있다시피, 모델은 데..
MVC 패턴은 Spring을 처음 접할 때 가장 먼저 배우는 기초적인 패턴입니다. 그 구조에서 메서드와 메서드 간에 데이터를 전달할 때 DTO, 또는 VO의 형태를 사용합니다. 그러나 이름마저 비슷한 이 둘은 도대체 어떤 차이가 있는 건지 처음 배우는 입장에서는 헷갈리기만 합니다. 오늘은 DTO와 VO의 차이에 대해서 알아보도록 하겠습니다. DTO란? 우선 DTO는 Data Transfer Object(데이터 전송 객체)로 계층 간에 데이터 교환을 위해서 사용하는 객체입니다. 여기서 계층이란, MVC 패턴의 Controller, Service, Repository를 뜻합니다. DTO는 로직을 갖고 있지 않은 순수한 데이터 객체 이며, 안의 field가 변해도 되기 때문에 보통은 Getter와 Setter..
둘기덕
'Java & Spring Boot' 카테고리의 글 목록