# Back-End
[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: $..
Spring Boot Java 8에서 11로 업그레이드
1. 로컬 PC 자바 세팅 (윈도우는 환경변수 바꿔줘야 함) 2. 인텔리제이 Gradle JVM 변경 3. build.gradle 자바 버전 변경 sourceCompatibility = '11' targetCompatibility = '11' 4. Project Structure에서 SDK 설정 변경
[Git] 브랜치 Merge와 커밋 히스토리 관리 (squash, rebase)
개요 Git Flow 전략을 적용하여 여러 브랜치를 관리하려면 Merge의 옵션을 적절하게 사용하고, 커밋을 최대한 간단하게 하여 알아보기 쉽도록 하는 것이 중요하다. 커밋이 여러 개로 쪼개진다면 돌아갈 수 있는 분기가 많아지지만, 그 브랜치가 다른 브랜치에 Merge되고 관리되어야 한다면 쪼개진만큼 어느 시점으로 돌아가야 할지, 어떤 작업을 했는지 알아보기가 어렵다. Merge란? 어떤 브랜치를 다른 브랜치에 반영하는 것 커밋 히스토리 관리의 필요성 어떤 작업을 했는지 명확하게 함 일관된 규칙으로 메시지를 작성 Rollback 상황에서 대처하기 쉬움 Merge, Squash, Rebase 1. Merge 브랜치를 합치기 위한 명령어 2. Squash 브랜치를 Merge할 때 사용할 수 있는 옵션 3. ..
[Spring] POI 라이브러리를 이용한 Excel 생성
POI 라이브러리를 이용한 Excel 생성 마케팅팀, 운영팀에서 요청하는 데이터를 제공하기 위해 MySql Workbench의 데이터 내보내기 기능을 사용하고 있었는데, 매번 쿼리를 입력하고 엑셀로 추출하는 번거로움이 있기 때문에 이를 직접 원하는 기간 등을 입력하고 다운받을 수 있도록 API로 만들게 되었다. 1. 의존성 compile('org.apache.poi:poi-ooxml:3.16') // .xlsx compile('org.apache.poi:poi:3.16') // .xls Excel 파일을 생성하기 위해 POI 라이브러리를 추가합니다. 2. Code 2.1 ReportService.java package com.kingpiggy.study.service; import com.kingpigg..
Multi module 프로젝트 구성
멀티 모듈 프로젝트란? 한 개의 프로젝트를 여러 모듈로 구성한 프로젝트 얻을 수 있는 장점 하나의 시스템에서 중심 도메인을 모듈로 분리 공통된 코드를 여러 곳에서 참조 가능 여러 프로젝트를 한 프로젝트 안에서 관리할 수 있음 구성 예제 Common 이라는 공통 모듈을 batch 모듈, external-api 모듈, internal-api 모듈 등에서 참조할 수 있다. 따라서 Entity 등 공통적으로 사용되는 부분을 한 곳에서 관리할 수 있게 된다. 주의할 점 공통 모듈은 다른 모든 모듈에게 영향을 끼치므로 리팩토링 하기 어려워지는 단점이 있다. 공통 모듈이 무거워지는 것을 조심해야 한다. 공통 모듈이 가져야 하는 의존성을 고려하자 특정 모듈에선 불필요한 의존성으로 인해 어플리케이션이 무거워 질 수 있다..
[Spring] 인텔리 J에 환경변수, VMware Option 설정
인텔리 J에 환경변수, VMware Option 설정 Develop, Live, Stage, Local 각각의 환경에서 Spring Application을 실행하다 보면, Static Resource Path나 Directory Path가 상이하여 실행 환경에 불편함을 느낄 수 있다. 스프링의 경우, Profile을 통해 각각의 설정을 통해 이에 대응할 수 있다. application.yml 등 스프링에 환경변수를 주입하여 실행하는 경우, Local에서도 적절하게 환경 변수를 주입하는 것이 필요하다. 이때 인텔리 J의 Build and run 설정을 적절히 바꿔 Local에서도 문제 없이 Application을 동일한 환경으로 실행시킬 수 있다. 1. 설정할 값들은? #/bin/bash # Sample ..
@ControllerAdvice를 이용한 예외처리
RestController의 응답 @RestController 로 선언하여 API를 개발할 때, 컨트롤러는 Response(응답)을 반환하게 되는데, Response에 포함되는 것들 Status, Message, Headers, Content type, body 등이 있다. Service 로직을 구현하고 컨트롤러가 서비스를 호출할 때, 예외를 발생시켜 오류 결과 또는 정상적으로 처리 됐을 때 처리 결과를 body에 담아 전송할 수 있다. @ControllerAdvice란? 컨트롤러 마다 예외를 처리한다면, 다른 컨트롤러에서 같은 예외가 발생했을 때 똑같은 처리 방법을 위해 중복 코드를 작성하게 될 수 있다. 이때 Contoller에서 일어나는 Exception들을 관리하고, 공통적으로 처리 방법을 선언하..
@Vaild를 이용한 Validation 검증
@Valid 어노테이션이란? Validation이란 어떤 데이터가 조건에 충족하는 지 확인하는 작업을 말합니다. 유효성 검사는 Front-end와 Back-end 양쪽에서 하는 것이 좋습니다. @Valid 어노테이션은 값에 제약조건을 설정하고, 이에 맞지 않은 데이터가 들어왔을 때 예외를 발생하는 어노테이션으로, DTO에 적용하면 쉽게 Validation을 진행할 수 있습니다. 실행 환경 의존성 implementation 'org.springframework.boot:spring-boot-starter-validation' 패키지 import javax.validation.constraints.*; @Valid 적용 방법 @RequestMapping(value = "/api/sample") @RestCo..