728x90

개발/Java & Kotlin 142

[Gradle] Gradle을 알아보자!

1. Gradle이란? Gradle은 오픈소스 빌드 도구로, 다음과 같은 특징이 있다. Groovy 또는 Kotlin DSL을 사용해서 빌드 스크립트를 작성의존성 관리: 외부 라이브러리 쉽게 다운로드하고 관리빌드 캐시, 병렬 빌드 지원: 빠른 빌드 가능유연성: 사용자 정의 태스크 추가 가능다양한 언어 지원: Java, Kotlin, Scala, Android 등 2. Gradle 주요 개념 📦 프로젝트와 태스크(Task)Gradle은 기본적으로 프로젝트 단위로 구성됨각 프로젝트에는 여러 개의 태스크(task)가 있음예: 컴파일, 테스트, 패키징, 배포 등예시// build.gradle (Groovy DSL)task hello { doLast { println '..

[Spring] 트랜잭션 롤백하는 예외

예외 종류에 따라서 트랜잭션 롤백이 다르게 동작한다. Spring Framework 기준으로 트랜잭션이 롤백되는 예외는 다음과 같은 규칙을 따른다. ✅ 기본 롤백 규칙예외타입트랜잭션 롤백 여부RuntimeException (또는 그 하위 클래스)O (롤백됨)ErrorO (롤백됨)Checked ExceptionX (롤백 안 됨) ❗ 예시@Transactionalpublic void someMethod() throws IOException { // IOException은 Checked Exception이므로 기본적으로 롤백되지 않음 throw new IOException("checked exception");} 위의 경우 트랜잭션은 롤백되지 않는다. @Transactionalpublic..

[Java] Null Object Pattern 공부

1. 개념 널 오브젝트 패턴은 null을 반환하거나 사용하지 않고, 그 대신에 행동은 하지만 아무 효과가 없는 객체를 반환하거나 사용하는 방식이다. 이 객체는 실제 구현체와 동일한 인터페이스를 구현하지만, 내부 로직은 아무것도 하지 않는다. 2. 구성요소 - 인터페이스 or 추상 클래스 > 공통된 메서드 정의 - 실제 구현 클래스(Real Object) > 기능을 실제로 수행 - 널 오브젝트 클래스(Null Object) > 아무것도 하지 않는 구현체 (혹은 디폴트 동작만 수행) 예제)public interface Log { void info(String message);}// 실제 로깅 구현public class ConsoleLog implements Log { publi..

[JPA] JPA에서 양방향 @OneToOne 관계와 Lazy Loading의 한계

JPA에서 @OneToOne 양방향 관계를 사용할 때, 연관 관계의 주인이 아닌 엔티티를 조회하는 경우 Lazy Loading이 제대로 동작하지 않는 이유와 그 해결책에 대해 살펴보자.   1. Lazy Loading의 동작 원리 Lazy Loading은 엔티티를 실제로 사용할 때 데이터베이스에서 해당 연관된 데이터를 조회하는 전략이다. 이때 JPA는 연관된 엔티티가 실제로 필요할 때만 쿼리를 실행하여 데이터를 가져오는데, 이를 통해 성능을 최적화할 수 있다.@Entitypublic class User { @OneToOne(fetch = FetchType.LAZY) private Profile profile;}@Entitypublic class Profile { @OneToOne(mapp..

[Spring] 의존성 주입 간단히 알아보자

1. 개념A 객체가 어떤 작업을 수행하기 위해 B 객체를 필요로 하는 경우에 두 객체 사이에 의존성이 존재한다고 표현한다. 이때, A 객체가 아닌 외부의 C 객체가 B를 생성한 뒤에 이를 전달해서 의존성을 해결하는 방법을 의존성 주입(Dependency Injection) 이라고 한다. 유연하고 재사용할 수 있는 설계를 만들기 위해서는 코드의 변경 없이 다양한 실행 구조를 만들 수 있어야 한다. 의존성 주입은 이를 돕는다. 예를 들어, A 객체 내부에서 B를 직접 생성하는 경우에는 B에 대한 결합도가 높아진다. 반면, B에 대한 생성 책임을 C에게 위임하고, C가 A에게 다시 전달해 주는 방식(의존성 주입)을 통해서 A는 B에 대한 결합도를 낮추고 유연한 설계를 만들 수 있다.       2. 의존성 주..

[Spring] 스프링 트랜잭션 전파 속성

1. 트랜잭션 전파란?스프링에서 트랜잭션 전파(Transaction Propagation) 는 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할 것인가를 결정하는 기능.@Transactional 어노테이션이 존재하는 메서드를 호출했을 때, 기존에 트랜잭션이 존재하면 재사용할지, 예외를 던질지 등 행동을 결정할 수 있다. 트랜잭션 전파 속성에는 REQUIRED, REQUIRED_NEW, MANDATORY, SUPPORTS, NOT_SUPPORTED, NESTED, NEVER가 존재하며, @Transactional 어노테이션의 propagation 속성에 값을 설정할 수 있다.   2. 설명REQUIRED: 트랜잭션이 존재하는 경우 해당 트랜잭션 사용하고, 트랜잭션이 없는 ..

[Spring] CQRS 패턴이란?

1. 개념시스템은 크게 상태 변경과 조회 기능을 제공한다. 주문 취소, 결제 기능은 상태 변경에 해당되며, 주문서 조회, 사용자 조회 등이 조회에 해당된다. 명령 쿼리 책임 분리 패턴(Command Query Responsibility Segregation, CQRS) 는 상태를 변경하기 위한 명령을 위한 모델과 상태를 제공하는 조회(Query)를 위한 모델을 분리하는 패턴을 의미한다. 예를 들어, Order라는 리소스를 Order(명령용), OrderData(조회용) 2개의 모델로 나누어서 관리할 수 있다. 이때 OrderData를 이용해서 표현 계층에 데이터를 출력하는 데 사용하고, 애플리케이션에서는 Order를 활용해 변경을 수행할 수 있다. - 자세히 !CQRS 패턴의 주요 개념 1. 명령(Com..

[Spring] 스프링 트랜잭션 AOP 동작 흐름

1. 스프링 트랜잭션 AOP 동작 흐름 @Transactional어노테이션을 사용한 선언적 트랜잭션 관리(Declarative Transaction Management)의 전체 흐름에는 크게 3가지 요소가 등장한다. 트랜잭션 매니저, 트랜잭션 AOP 프록시, 트랜잭션 동기화 매니저가 이에 해당된다. 클라이언트 코드로부터 요청이 들어오면 트랜잭션 AOP 프록시가 트랜잭션 매니저를 획득하고, 트랜잭션을 시작하기 위해서 트랜잭션 매니저에게 요청한다. 트랜잭션 시작 요청 받은 트랜잭션 매니저는 데이터소스를 통해 커넥션을 받아오고 트랜잭션을 시작한다. 그리고, 트랜잭션 매니저는 트랜잭션이 시작된 커넥션을 동기화 매니저에 보관한다. 이후 트랜잭션이 종료되는 경우 트랜잭션 매니저는 트랜잭션 동기화 매니저에 보관한 커..

[Kotlin] 코틀린 + 스프링부트로 단숨에 완성하는 초강력 JWT 인증 시스템!💡 보안과 성능을 모두 잡아라!🔥(2)

지난번에 예외발생 DTO를 생성까지 작성했다. [Kotlin] 코틀린 + 스프링부트로 단숨에 완성하는 초강력 JWT 인증 시스템!💡 보안과 성능을 모두 잡아라!🔥  1. validation 추가컨트롤러를 다시 보면 @RequestBody 옆에 @validated가 있었다. 이는 필요한 값이 안왔을 경우 예외를 발생시킨다. @PostMapping("/signup") fun signup( request: HttpServletRequest, @RequestBody @Validated(SignUpValidation::class) reqAuthDto: ReqAuthDto, result: BindingResult ): ResponseEntity { ..

[Kotlin] 코틀린 + 스프링부트로 단숨에 완성하는 초강력 JWT 인증 시스템!💡 보안과 성능을 모두 잡아라!🔥

코틀린 스프링부트로 JWT구현해봤다. 제목은 어그로 ㅎㅎ GPT가 만들어준..   1. 코틀린으로 프로젝트 생성한다.라이브러리는dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-validation") implementati..

728x90