전체 글

Spring

[Spring] Java 예외(Exception) 처리 전략

목표안정성있고 유연한 예외처리를 가진 애플리케이션 설계 방법에 대한 방법을 고민하고 정리한다. 예외(Exception)Java에서 예외는 비정상적인 상황을 나타내는 객체이며, 다음과 같이 Throwable 클래스 하위의 다음 두가지로 나뉜다. Checked Exception컴파일 시점에 처리를 강제하는 예외이다.만약 해당 예외에 대해 try-catch, throws로 처리되어 있지 않다면 컴파일 시점에 에러가 발생한다.반드시 예외처리를 해야하며, 개발자에게 안정성을 강제한다. Unchecked Exception런타임 시점에 발생하는 예외이다.컴파일러가 예외처리를 강제하지 않기때문에, 예외처리를 강제하지 않아도 된다.컴파일 시점에는 에러가 발생하지 않으나, 런타임 시점에 해당 예외처리가 되어있지 않다면 에..

Spring

[Spring] 카카오 로그인 REST API 방식 적용 및 구현

카카오 로그인 공식 레퍼런스를 참고하여 작성https://developers.kakao.com/docs/latest/ko/kakaologin/common Kakao Developers카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.developers.kakao.com  프로젝트 코드 Githubhttps://github.com/kwj2435/kakao-restapi-login 기술 스택Java 17Spring Boot 3.x.xThymeleafOpenFeign 1. 카카오 개발자 센터 세팅개발을 시작하기전, 카카오에서 제공하는 Rest API 방식의 로그인 시퀀스 다이어그램을 살펴보자.1. 사용자는 카카오 로그인을..

Spring

[Spring] 스프링 부트(Spring Boot) - H2 DB 연동하여 사용하기(with.JPA)

H2 DB란?https://www.h2database.com/ H2 Database는 Java로 구현된 경량형 RDBMS이다.Server, Embedded, In-Memory 3가지 Mode를 제공하며, 간단한 설정으로 빠르게 실행할 수 있어 로컬 개발 환경에서 많이 사용된다. 별도의 DB툴이 없이도 웹 브라우저를 통해 데이터베이스를 시각적으로 관리할 수 있는 인터페이스를 제공하며, 표준 JDBC 드라이버를 제공하여 Java 애플리케이션과 쉽게 연결이 가능하다.H2 데이터 베이스 하나만으로도 여러 다른 데이터베이스(MySQL, PostgreSQL)와 유사한 SQL 문법을 사용할 수 있도록 지원한다.Spring Boot와 연동하기1. Spring 프로젝트 초기 생성시 Spring Initializr를 통해..

Java

[Java] JVM Warm up - if(kakao)2022

2022년 진행된 if(kakao)에서 발표하신 카카오모빌리티 이형구님의 JVM Warm Up 세션을 보고 정리한 내용입니다. 계정 서버 배포 직후 발생하는 초기 API 응답 Latency 지연문제를 JVM에서 원인을 찾고 해결한 내용입니다.제가 작성한 모든 글의 내용과 사진은 if(kakao)2022에서 발표한 내용을 인용 및 사용하였습니다.계정 서비스계정 서비스는 높은 TPS를 특징으로 가지고 있으며, 빠른 응답 속도를 보장하는 것이 중요한 서비스이다.Java, Spring 기반으로 서비스가 작성되어 있으며, 오늘의 내용을 살펴보기 앞서 Java에 대해 잠깐 알아볼 필요가 있다. 작성된 Java Code를 중간언어인 Byte Code로 변환되며 War, Jar로 Archive되어 사용된다. 빌드된 ..

Java

[JAVA] 회원 시스템 분산 트랜잭션(JTA) 처리와 성능 이슈 해결

분산 트랜잭션(JTA)기반의 회원 시스템 개발오랫동안 농익은 레거시 시스템은 현재 시점에서 뜯어볼수록 의문이 많은 설계와 코드들이 참 많습니다.제가 속한 서비스의 회원 시스템도 마찬가지였습니다. 서비스를 이용하는 회원의 정보가 서로 다른 3개의 DB에 나뉘어 관리되고 있었습니다. 한명의 회원 정보가 여러 DB에 나뉘어 저장되는 것도 아니고, 유입된 채널에 따라 저장되는 DB가 물리적으로 분리되어 있었습니다.즉 온라인에서 가입한 고객은 오프라인에서 확인할 수 없고, 오프라인에서 가입한 고객은 온라인 서비스에서 접근할 수 없는 구조였습니다.이는 당연히 마케팅 측면이나 서비스의 확장성 측면에서 많은 어려움을 만들고 있었고, 이를 통합하기 위한 자칭 '통합회원 프로젝트'를 진행하게 되었습니다. 분리되어 있는 D..

Spring

[Spring] Junit 테스트시 Atomikos 커넥션풀의 Connection Name 중복 오류

문제 발생‘어느날 갑자기’ Jenkins 배포중 빌드가 실패, Jenkins 실패 원인을 보니 테스트가 깨지고 있었음현상 재현을 위해 로컬에서 테스트를 돌렸으나 모든 테스트는 PassJenkins의 간헐적 이슈 인가 싶어 다시 Jenkins 빌드를 진행하니 성공후 정상 배포되었음(이때까지만 해도 Jenkins의 버그로 인한 단순 해프닝으로 생각)2주뒤 다시 정기배포일자가 다가왔고, 배포를 진행했으나 이전과 동일하게 다시 Jenkins 빌드가 실패함로컬에서도 마찬가지로 테스트가 깨지고 있었고 로그에서는 아래와 같이 Atomikos 에러가 출력 수 차례 재시도 하니 정상적으로 배포됨...나를 더욱 헷갈리게 하는 상황들Jenkins 배포시에도 매번 실패하는 것이 아닌 여러번 시도하면 그 중 한번은 성공함로컬에..

Database

[Database] 트랜잭션 격리 수준(Isolation Level)

트랜잭션 격리 수준(Isolation Level)이란?트랜잭션의 격리 수준은 여러 트랜잭션이 혼재되어 있는 상태에서, 하나의 트랜잭션이 다른 트랜잭션의 데이터에 접근 할 수 있는 '정도'를 의미한다. 트랜잭션 격리 수준은 4단계로 나뉘어 진다.0 - Read Uncommitted1 - Read Committed2 - Repeatable Read3 - Serializable 격리 수준이 높아질 수록 트랜잭션의 고립 강도가 높아지는 반면, 성능저하도 야기된다.일반적인 서비스에서는 Read Committed 혹은 Repeatable Read 수준을 사용하며, 서비스의 요구사항에 따라 적절한 격리 수준을 정해 사용해야 한다. 여러 트랜잭션이 존재하는 상황에서 트랜잭션들의 경합으로 발생하는 문제는 격리수준별 다음..

Software Engineering

[디자인패턴] 팩토리 메서드(Factory Method) 패턴

1. 팩토리 메서드 패턴이란?- 객체 생성을 위한 패턴- 객체 생성에 필요한 과정을 템플릿처럼 정해 놓고 각 과정을 다양하게 구현이 가능- 객체 생성에 대한 인터페이스와 구현의 분리- 구체적으로 생성할 클래스를 유연하게 정할 수 있음 팩토리 메서드 패턴은 객체 생성을 Factory 클래스로 캡슐화하여 대신 생성하게 하는 '생성' 디자인 패턴이다. 클라이언트가 직접 new 연산자를 통해 객체를 생성하는 것이 아닌 객체 생성을 도맡는 Factory 클래스를 만들고, 이를 상속하는 서브 Factory 클래스에서 여러 타입의 객체 생성을 책임지는 것이다. 또한 Factory에서 객체 생성시의 전처리 혹은 후처리를 통해 생성 과정을 유연하게 처리 할 수 있다.  위키피디아에 나와 있는 UML 다이어그램으로는 팩토..

turtleDev
거북한 개발자의 기록