전체 글
[Spring] WebClient를 이용한 Naver Papago 번역 연동
[Spring] WebClient를 이용한 Naver Papago 번역 연동
2023.03.07들어가기 전 먼저 Papago를 쓰기 위해 준비해야 되는 단계가 있어 그거에 대해 먼저 알아보고 WebClient를 이용하여 Papago를 연동하는 방법에 대해 Java코드로 알아보겠습니다. Papago 1. 네이버 개발 문서를 들어가서 애플리케이션 등록을 클릭합니다. 2. 프로젝트에 사용할 Papago 애플리케이션 이름을 지정하고 사용 API는 Papago번역을 클릭합니다. 그리고 프로젝트 환경에 맞게 서비스 환경을 선택해 줍니다. 3. 서비스 환경을 클릭하면 서비스할 URL을 작성을 하면 됩니다. 서비스할 URL은 프로젝트에서 사용할 URL을 사용하면 됩니다. 그 후 등록하기 버튼을 클릭합니다. 4. Client ID와 Client Secret가 발급이 됩니다. 그럼 이제 Papago 번역을 이용할 ..
[JPA] Kotlin을 이용하여 Soft Delete 구현
[JPA] Kotlin을 이용하여 Soft Delete 구현
2023.03.04들어가기 전 Soft Delete와 Hard Delete에 대해 설명하고 Kotlin을 이용하여 JPA에서 지원해 주는 Auditing과 JpaRepository를 이용하여 Soft Delete를 구현하는 예제에 대해 알아보겠습니다. Hard Delete란? DB에 저장되어 있는 데이터를 물리적으로 삭제하는 것을 의미합니다. JPA에서 제공하는 메서드 deleteById, delete, deleteAll 등을 이용하거나 DML 중 하나인 delete 쿼리를 이용해서 물리적으로 데이터를 삭제할 수 있습니다. Soft Delete란? Hard Delete와 달리 DB에 저장되어 있는 데이터를 물리적이 아닌 논리적으로 삭제하는 것을 의미합니다. 논리적으로 삭제한다는 것은 테이블 컬럼 중 하나를 해당 데이터가 ..
[Kotlin] data class VS class
[Kotlin] data class VS class
2023.02.24들어가기 전 코틀린에서는 class와 data class가 존재합니다. data class에 대해 설명을 하면서 일반적인 class와의 차이점을 다뤄보겠습니다. data class data class는 데이터 보관 목적인 클래스입니다. data class의 형식은 아래와 같습니다. data class DataClassExample(val name: String, val age: Int) data class는 보일러 플레이트 코드를 줄여줍니다. 보일러 플레이트 코드가 무엇인지 궁금한 분은 아래 블로그를 들어가시면 내용이 있으니 보고 이어서 내용을 보시면 좋을 거 같습니다. 보일러 플레이트란? 보일러 플레이트 들어가기 전 보일러 플레이트의 정의만 보고 "오? 보일러 플레이트코드 좋은 거 같은데 왜 보일러 플..
[Kotlin] 기본 문법 (1)
[Kotlin] 기본 문법 (1)
2023.02.19들어가기 전 코틀린 기본 문법을 설명하면서 이해를 쉽게 할 수 있도록 자바 문법과 비교해 가면서 설명할 것입니다. var, val 이란? 코틀린에서는 변수나 상수를 선언을 할 때 var와 val을 사용하여 선언을 합니다. var : 가변의 속성을 가진 것에 선언을 합니다. val : 불변의 속성을 가진 것에 선언을 합니다. var num1 = 1 // 가변의 속성을 가졌을 경우 val num2 = 1 // 불변의 속성을 가졌을 경우 그럼 자바에서는 어떻게 변수와 상수를 나타내는지에 대해 알아보겠습니다. int num1 = 1 // 가변의 속성을 가졌을 경우 final int num2 = 2 // 불변의 속성을 가졌을 경우 속성 Java Kotlin 가변 속성 int num1 = 1 var num1 = 1..
[Spring] RestControllerAdvice를 이용한 Validation처리
[Spring] RestControllerAdvice를 이용한 Validation처리
2023.02.11들어가기 전 RestControllerAdvice가 무엇인지에 대해 먼저 알아보고 RestControllerAdvice을 활용한 Validation처리 방법에 대해 알아보겠습니다. validation을 하기 위한 설정 build.gradle implementation 'org.springframework.boot:spring-boot-starter-validation' 의존성을 추가하면 @Valid를 이용하여 Validation처리를 할 수 있습니다. @RestControllerAdvice이란? @ExceptionHandler, @ModelAttribute, @InitBinder가 적용된 메서드들에 AOP를 적용해 Controller단에 적용하기 위하 고안된 어노테이션입니다. 클래스에 선언하면 되고 @R..
[Redis] Spring Boot + Docker-Compose + Redis + Session을 이용한 로그인
[Redis] Spring Boot + Docker-Compose + Redis + Session을 이용한 로그인
2023.02.01들어가기 전 글의 순서는 Docker-Compose로 Redis 세팅하고 Spring에서 세팅된 Redis에 대한 설정을 한 뒤 Session을 이용해서 로그인하는 순서대로 설명하겠습니다. Docker-Compose로 Redis 세팅 docker-compse.yml 파일을 만들어서 아래와 같이 설정을 해줍니다. version : "3" services : redis: image: redis:latest container_name: redis hostname: test ports: - "6379:6379" image : redis 이미지를 내려받습니다. 여기서 latest는 최신버전을 뜻합니다. 즉 최신버전 redis를 이미지로 내려받습니다. container_name : 다운받은 redis image를 ..
[Redis] Redis 개념 및 특징
[Redis] Redis 개념 및 특징
2023.01.27들어가기 전 Redis는 Cache와 연관이 되어 있어 Cache에 대해 먼저 알아보고 Redis의 개념과 특징에 대해 알아보겠습니다. Cache란? 자주 사용하는 데이터를 메모리에 미리 복사해 놓는 임시 장소입니다. 캐시는 저장공간이 작고 비용이 비쌉니다. 하지만 사용하는 이유는 빠른 성능을 제공하기 때문입니다. 보통 데이터를 사용할 때 디스크에 접근을 해서 저장된 데이터를 사용을 합니다. 지속적으로 데이터를 요청을 하면 DBMS의 부하가 늘어나고 시간도 오래 걸립니다. DBMS의 부하를 줄이고 시간을 줄이기 위해 캐시를 사용합니다. 캐시는 메모리에 데이터를 저장하고 관리하기 때문에 DBMS에 접근하는 거에 비해 성능이 뛰어납니다. 클라이언트가 원하는 데이터를 요청을 했을대 캐시에 원하는 값이 있으면 ..
[JPA] N+1 원인 및 해결방법
[JPA] N+1 원인 및 해결방법
2023.01.18들어가기 전 이번 글에서는 N+1이 무엇이고 발생 원인과 N+1을 방지하기 위한 임시방편, 해결방법에 대해 알아보겠습니다. 그리고 예시로 Person, House 엔티티가 있습니다. Person(N) : House(1) 관계로 이루어져 있습니다. 즉 Person이 해당 예시에서 연관관계 주인입니다. @Entity @Getter @Setter public class House { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String address; } @Entity @Getter @Setter public class Person { @Id @GeneratedValue..
보일러 플레이트
보일러 플레이트
2023.01.13들어가기 전 보일러 플레이트의 정의만 보고 "오? 보일러 플레이트코드 좋은 거 같은데 왜 보일러 플레이트코드를 줄이려고 하지?"라는 생각으로 처음에 이해가 잘 가지가 않았습니다. 그래서 이번 글에서는 보일러 플레이트 정의, 단점, 줄이는 법과 필자가 왜 좋다고 생각했는지에 대해 알아보겠습니다. 보일러 플레이트란? 보일러 플레이트는 최소한의 변경으로 여러 곳에서 재사용되며, 반복적으로 비슷한 형태를 띠는 코드를 말합니다. 예시) public class Person { private String name; private int age; public Person() {} public Person(String name, int age) { this.name = name; this.age = age; } publ..
[Jenkins] Docker를 이용한 Jenkins 초기설정
[Jenkins] Docker를 이용한 Jenkins 초기설정
2022.12.15들어가기 전 Jenkins 초기 설정에 들어가기 앞서 CI/CD에 대해 먼저 알아보겠습니다. 그리고 Docker 설치에 대한 설명은 생략하겠습니다. 필자가 작업하는 환경은 mac os 환경이라 mac os 기준으로 설명해 나가겠습니다. CI/CD란 CI(Continuous Integration) : CI는 지속적인 통합을 뜻합니다. 지속적인 통합은 개발을 진행하면서도 품질을 관리할 수 있도록 하는 것으로 여러 명이 하나의 코드에 대해 수정을 진행해도 지속적으로 통합하면서 관리할 수 있는 것을 말합니다. CI는 빌드 -> 테스트 -> 병합(merge)을 자동화해주는 것입니다. 자동화를 해주면 개발자 입장에서는 편할 수밖에 없습니다. 예를 들어보면 로컬에서 작업을 하고 빌드 -> 테스트 -> 병합(merge..
[Java] ConcurrentModificationException 원인 및 해결 방법
[Java] ConcurrentModificationException 원인 및 해결 방법
2022.11.22들어가기 전 필자가 이 내용을 다루게 된 이유는 업무를 보다가 ArrayList로 담긴 데이터를 순회하면서 삭제하다가 ConcurrentModificationException 예외를 접하게 되었습니다. 자바를 여태 하면서 IndexOutOfBoundsException는 많이 봤어도 ConcurrentModificationException라는 예외는 처음 봐서 이거에 대해 알아보고 싶었고 그리고 이 문제를 겪는 사람들이 많을 거라고 생각되어 다루게 되었습니다. 이제 문제의 원인이랑 해결방법에 대해서 알아보겠습니다. 원인 원인에 대해 먼저 알아보기 전 원인이 된 코드를 먼저 보겠습니다. public class Test { public static void main(String[] args) { List fi..
[Spring Boot] @ModelAttribute + 객체값 Null일때 해결방법
[Spring Boot] @ModelAttribute + 객체값 Null일때 해결방법
2022.10.25들어가기 전 해결방법은 lombok 라이브러리를 사용하여 해결하는 과정을 써 내려갈 것입니다. @ModelAttribute @ModelAttribute가 무엇인지는 간략하게 설명하겠습니다. @ModelAttribute는 @RequestParam처럼 파라미터로 값을 바인딩하는 것인데 @RequestParam은 하나의 대한 파라미터이고 @ModelAttribute는 여러 개의 값을 객체에 정의하고 파라미터의 값을 여러 개를 받을 때 사용합니다. 그리고 사용을 할 때 @RequestParam과 @ModelAttribute는 생략이 가능합니다. 만약 아래와 같이 코드를 작성하여 @ModelAttribute를 사용하면 어떻게 될까요? Controller 코드 @RestController public class T..