분류 전체보기

    [InteliJ] 인텔리제이 설정 백업

    Java Code Template #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java") /** * ${NAME} class. * * Describe here. * * * * History: * damian.lee, 0.1.0, Created at ${YEAR}.${MONTH}.${DAY} * * * @author : ${USER} * @version : 0.1.0 */ public class ${NAME} { } Live Template xptmxm @org.junit.jupiter.api.Test @org.junit.jupiter.api.DisplayName("") void ..

    Insert문 전에 발생하는 Select문을 제거해보자

    주제 JPA save 호출 시 Insert문 전에 Select문이 발생하는 이유를 알아본다. Select문을 제거하여 성능 개선을 경험한다. 1. JPA Insert 하기 전에 Select 문이 발생하는 이유 1.1 Save 메소드를 열어보자 SimpleJpaRepository를 확인하면 저장하려는 엔티티가 새로운 것인지 isNew를 통해 확인하고 저장한다. 새로운 엔티티의 경우 persist 기존에 있던 엔티티라면 merge 1.2 isNew의 기준을 재정의하자 AbstractEntityInformation.class 를 보면 isNew의 기준은 엔티티의 ID(식별자)를 보고 새로운 엔티티인지 판별하게 된다. 우리는 엔티티에 Persistable를 구현하여 이 기준을 재정의 한다. package com..

    JPA Batch Insert/Update를 적용하여 성능 향상하기

    주제 하이버네이트, JDBC에 Batch Insert/Update 설정을 추가해본다 Batch로 처리했을 때의 성능 개선을 경험한다. 1. Batch Insert/Update에 대해 알아보기 1.1 Batch Insert/Update 란? INSERT INTO USER (ID, USER_NAME, AGE) VALUES (1, '춘식이', 19); INSERT INTO USER (ID, USER_NAME, AGE) VALUES (2, '라이언', 20); INSERT INTO USER (ID, USER_NAME, AGE) VALUES (3, '어피치', 21); ... ... 대량의 데이터를 조작하려면 여러 번 Save 혹은 Update를 수행해야 한다. 저장할 데이터가 10,000건일 경우 데이터 1개를..

    @Transactional 어노테이션을 이용한 트랜잭션 관리

    주제 @Transactional 어노테이션에 대해 알아본다. @Transactional을 적용해본다. 1. @Transactional 어노테이션이란? 1.1 트랜잭션이란? 트랜잭션이란 어떠한 작업들의 묶음이다. 트랜잭션이란 어떠한 작업들의 묶음이다. 데이터를 동기화 시키기 위한 작업들을 나열해보면 다음과 같다. 새로운 데이터를 받아옴 필요에 따라 데이터를 백업 기존 데이터에 반영(삭제, 수정, 저장) 이러한 여러 작업을 하나로 묶는다면 동기화 트랜잭션으로 만들 수 있다. 트랜잭션은 ACID 라는 특성이 있는데, 이는 하나의 트랜잭션에서 일어나는 작업들의 일관성/안전성을 보장하기 위한 특성이다. Spring 에서는 @Transactional 어노테이션을 통해 트랜잭션을 적절하게 관리할 수 있다. 1.2 @..

    [Java] [Mac] 여러 버전의 Java를 설치/변경하기

    개요 여러 프로젝트를 운영하다 보니 프로젝트 마다 다른 Java 버전을 사용해야 하는 경우가 발생했다. Java의 여러 버전을 설치하고 변경하는 방법을 알아본다. Brew를 통한 Java 여러 버전 설치 Brew를 통해 Java를 간단하게 설치할 수 있다. # openjdk를 설치할 수 있도록 추가 $ brew tap adoptopenjdk/openjdk # 설치 가능한 jdk 검색 $ brew search jdk # Java 설치 $ brew install --cask adoptopenjdk8 $ brew install --cask adoptopenjdk11 $ brew install --cask adoptopenjdk13 Java 설치 확인 / 버전 변경 # 설치된 Java 목록 확인 $ /usr/l..

    [Git] 에러 remote: Invalid username or password. fatal: Authentication failed for

    remote: Invalid username or password. fatal: Authentication failed for ... 깃허브 비밀번호를 바꿨을 때 발생하는 오류 맥북 : 키체인 접근 들어가서 github 검색 → 변경한 비밀번호로 다 바꿔줌 다른 방법은 퍼스널 토큰을 발급받는 방법도 있는듯한데 이렇게도 해결이 가능하다

    Semantic Versioning

    개요 프로그램의 변화에 따라 의미 있고 적절한 버전을 붙여주기 위해, Semantic Versioning 이라는 버전 관리 규칙을 알아본다. Semantic Versioning이란? Semantic Versioning은 Github의 공동창업자인 Tom Preston-Werner가 위의 문제를 해결하기 위해 기존의 현안을 모아 만든 제안입니다. 스펙 문서는 RFC 2119에 의해 규칙을 표기하여 의미적 엄격함을 높이고, 패키지 개발 생명주기에 발생할 수 있는 여러 상황을 포괄적으로 담아 일관성과 유연성을 균형 있게 갖추고 있습니다. 0.1.0 Major Version : 기존 api 변경 및 삭제 되거나 하위 호환이 되지 않는 버전 Minor Version : 신규 기능이 추가되거나 개선되었고 하위 호환..

    [Spring Data JPA] Pageable을 이용한 Paging 조회

    개요 Paging 처리를 하는 여러 방법 중 Pageable 객체를 사용한 방법을 알아본다. 코드 1. Controller @RequiredArgsConstructor @RestController public class MovieController { private final MovieService movieService; @GetMapping("api/movies") public ApiResponse getMoviesPaging(@RequestParam(defaultValue = "0") Integer pageNo, @RequestParam(defaultValue = "10") Integer pageSize) { Pageable pageable = PageRequest.of(pageNo, pageSiz..

    [Git] Git Commit을 되돌리기(+ Rebase로 커밋 히스토리 관리하기)

    Git Commit을 되돌리기 (+ Rebase로 커밋 히스토리 관리하기) 작업을 하다보면 자신의 커밋을 되돌려야 할 때도 있다. 어떤 방법을 사용할 수 있는지 정리해본다. 종류 1. Reset을 이용한 강제 롤백 Reset 명령어를 사용할 때 주의할 점은 되돌리려는 브랜치를 다른 개발자가 Check out하여 사용중일 경우 그 사용자는 되돌린 사실을 알 수 없다. 즉 강제로 브랜치의 커밋 내역을 지우는 것이기 때문에 협업하는 사람이 있으면 주의하여 사용해야 한다. git reset --hard HEAD~3 (롤백하려는 브랜치 기준 점이 3개가 들어왔다.. .) git push origin -f 커밋 내역을 깔끔하게 관리하기 위해 Rebase 명령어를 통해 여러 커밋을 하나로 합칠 수 있다. git re..

    Logback과 slf4j 간단한 예제

    로그 레벨 TRACE : 추적 레벨은 DEBUG보다 좀 더 상세한 정보를 표시 DEBUG : 프로그램을 디버깅하기 위한 정보를 표시 (운영 서버에서는 표시하지 않도록 설정) INFO : 상태 변경과 같은 정보성 로그를 표시 WARN : 처리 가능한 문제, 시스템 에러의 원인이 될 수 있는 경고성 메시지를 표시 ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시 ※ 로그 레벨로 설정한 값 이상의 로그가 출력됨 (EX: 로그 레벨 INFO : INFO, WARN, ERROR가 출력됨) Yaml 단순 설정 # log logging: level: root: INFO org: hibernate: SQL: OFF type: descriptor: sql: BasicBinder: OFF file: name: $..