Programming/JPA ⁄Spring 47

[Spring Boot] git 정보 확인하는 endpoint 작성하기

Intro 서버에 현재 배포되어 있는 어플리케이션의 버전 정보를 표시 할 수 있는 방법이 있을까 고민을 해 보았습니다. 하나의 프로젝트가 여러개의 서버에서 각기 다르게 서비스 되고 있다 보니 해당 정보를 관리자 페이지에서 확인 할 수 있게끔 하면 좋겠다는 생각이 들었는데요. 방법이 있었습니다. git-commit-id-plugin 이라는 메이븐 플러그인을 활용하면 어렵지 않게 구현 할 수 있습니다. 아래는 Spring Boot 공식 매뉴얼에 작성된 관련 내용 입니다. https://docs.spring.io/spring-boot/docs/2.1.7.RELEASE/reference/html/howto-build.html#howto-git-info 설정 Maven Dependencies pom.xml org..

Spring) 스프링의 "redirect:" 리다이렉트 처리

Intro Spring Framework 를 사용한다면 컨트롤러에서 리턴타입은 String으로 하고 view 이름 대신 "redirect:" 로 시작하는 문자열을 반환 하면 해당 주소로 리다이렉트를 시켜 줍니다. "redirect:" 를 했는데 리다이렉트가 되지 않고 있다는 질문을 받아서 코드를 확인해보는데, 일단 redirect에 오타는 없었습니다. 그러면 혹시 @ResponseBody 어노테이션이 적용된건지 확인을 하는데 그렇지 않기에 코드를 맨 위로 올려보니 아니나 다를까 @RestController 어노테이션이 보였습니다. 이럴땐 간단하게 @Controller로 바꾸고 필요한 부분들에만 @ResponseBody 어노테이션을 작성 하거나 아니면 리턴타입을 ResponseEntity로 하는 방법이 있..

Programming/JPA ⁄Spring 2022.05.13 (1)

Spring) 필드 인젝션의 해로움 _생성자 주입을 사용해야 하는 이유

Intro 스프링을 처음 접하며 의존성 주입이라는 개념을 배운 이후로 한참을 필드 인젝션만 사용 해 왔습니다. 영한님의 스프링이나 JPA 강의에서는 생성자주입을 사용하라고 하고, 학습할때는 항상 생성자 주입을 사용하는 습관을 들여 왔지만 이미 기존에 @Autowired 로 작성된 프로젝트들을 손대기에는 충분한 명분도 스스로의 확신도 사실 없었습니다. 단일 테스트 작성에 어려움을 느꼈을때에도, 아직 테스트 코드를 본격적으로 작성하던 건 아니었기 때문에 스프링 컨테이너를 일일히 띄워가며 테스트를 진행 하기도 했었습니다. 생성자 주입으로 바꾼 계기 그러던 중 꽤나 오래된 프로젝트에서 필드 인젝션을 싹 다 걷어내고 생성자 주입으로 바꾸게 된 계기가 있었습니다. 스프링 부트 1.5 버전을 사용하며 여러가지 불편을..

SpringBoot의 JSON 직렬화시 날짜 처리

Intro SpringBoot 버전을 1.5에서 2.5로 마이그레이션 한 이후로 인지하지 못했던 여러가지 변화 들이 하나 둘 씩 더 발견되고 있습니다. 이번에 발견된 변화는 꽤나 당황스러웠는데.. Date 객체를 JSON으로 직렬화 할 때, 그 형태가 달라졌다는 겁니다. API 를 제공하는 입장에서는 일관적인 포맷으로 제공해주는게 굉장히 중요한데 API 스펙 자체가 변경되어 버릴 수 있는 큰 문제 입니다. 비교를 해 보면 Spring Boot 1.5 에 의존하는 프로젝트 Spring Boot 2.5 에 의존하는 프로젝트 스프링 부트 버전이 달라졌을 뿐인데 반환하던 API의 포맷이 변경 되어 버렸습니다. 이 변경을 추적 해 보겠습니다. 다소 내용이 길기 때문에 과정을 건너 띄고 설정 방법만 보려면 Spri..

Spring Boot 1.5 -> 2.5 마이그레이션 회고

Intro 최근 스프링 부트 1.5 버전으로 작성된 프로젝트를 Spring Boot: 2.5.10 버전으로 올리는 작업을 진행 하였습니다. 스프링부트 앞자리 버전 차이가 굉장히 큰데, 온라인 게임에 비유한다면 메이플스토리에서의 빅뱅 혹은 와우의 대격변 전후를 생각하면 이해가 빠르겠습니다. 단순히 pom.xml에서 버전 명시를 변경한다고 뿅 하고 바뀌는건 아니고, 스프링 부트 변경에 따라 여러가지 클래스가 사라지고 새로 생겨났으며 각종 메서드들의 변화도 상당합니다. 스프링 설정 하는 방법도 달라지고, 구석구석 영향이 가지 않는 곳이 거의 없기 때문에 프로젝트가 크면 클수록 그 여파가 상당합니다. 제가 이번에 마이그레이션을 진행한 프로젝트도 몇년간 진행되며 몇번의 고도화를 거친 프로젝트이다 보니 규모도 제법..

HikariCP) Connection Pool 설정 및 확인하기

Intro 실제 사용하는 커넥션 수에 비해서 커넥션 풀을 넉넉하게 잡고 있었는데, 해당 DB를 여기저기서 다 사용하다 보니 커넥션 풀을 조금 타이트하게 가져가 달라는 요청을 받았습니다. Connection Pool을 조절하고, 실제로 DB에서 커넥션을 몇개나 물고 있는지 확인 해 보도록 하겠습니다. 설정 application.yml 스프링 부트에서 Hikari 설정은 spring.datasource.hikari 에 합니다. 변경 전 spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/postgres usern..

LDAP으로 스프링 시큐리티 인증하기

https://spring.io/guides/gs/authenticating-ldap/ 시작하기전에 우리는 이걸 할꺼에요. Spring Security의 임베디드 자바기반의 LDAP 서버에 의해 보안되는 간단한 웹 어플리케이션 몇몇 유저 셋을 포함한 데이터 파일과 LDAP 서버 로드 무엇이 필요해요? 15분의 시간 좋아하는 IDE 메모장도 상관 없어요! 하지만 STS나 IntelliJ IDEA가 있으면 더 쉽게 할 수 있어요. JDK 1.8 이상 Gradle 4 이상 혹은 Maven 3.2 이상 어떻게 따라해요? 대부분의 다른 Spring 가이드 문서들 처럼 완전 기초부터 하나씩 기본적인 단계를 따라하며 할거에요. 대부분 이미 익숙한 개념들이니 걱정 할 필요 없어요. 크게 두가지 방법이 있는데요. 어느 ..

JPA) 데이터베이스 스키마 자동 생성

참고 강의 : 우아한 형제들 김영한 팀장님 https://www.inflearn.com/course/ORM-JPA-Basic/dashboard ​ hibernate.hbm2ddl.auto hibernate 에서는 해당 프로퍼티를 설정 함으로서 SessionFactory 가 생성 될 때 스키마 DDL(Data Definition Language)을 검증하고 내보낼 수 있습니다. hibernate.dialect 속성을 통해 데이터베이스에 적절한 DDL을 생성 하는데 이렇게 생성된 DDL은 개발 단계에서만 사용하는게 좋습니다. ​ hibernate.hbm2ddl.auto 속성의 value 에 들어 갈 수 있는 값은 아래와 같습니다. 옵션 하는일 create 기존 테이블을 삭제 한 뒤에 새로 생성 create-..

H2 데이터베이스를 이용해 JPA 실습해보기

인프런에서 우아한 형제들 김영한님의 JPA 강의를 학습하며 내용을 정리 해 보았습니다. 해당 강의를 들어보시길 추천합니다. https://www.inflearn.com/course/ORM-JPA-Basic/dashboard ​ H2 데이터베이스는 자바기바느이 오픈소스 RDBMS(관계형 데이터베이스 시스템)입니다. 인메모리 DB 기능을 지원하며 굉장히 용량도 작고 가볍게 동작하기 때문에 번거롭게 데이터베이스를 구축 할 필요 없이 손쉽게 실습을 할 수 있어 편리합니다. ​ H2 DATABASE 설치 아래의 공식 사이트에서 다운 받습니다. 저는 MacOS 를 사용중이기 때문에 All platforms 를 클릭 해 다운 받았습니다. https://h2database.com ​ 이후 적당한 폴더에 위치 시킵니다...

IntelliJ IDEA) Devtools 사용해 HTML, CSS 등 정적자원 서버 재시작 없이 새로고침

2022년 1월 1일 기준으로 새로 업데이트 합니다. 인텔리제이 버전이 2021.3으로 업데이트 되며 메뉴 구성이 약간씩 바뀌어서 거기에 맞춰 새로 변화 했습니다. 설정이 자주 변하다보니 인터넷에서 정보를 찾는 입장에서는 많이 불편 할 수 있지만 자세히 보면 결국 위치만 바뀐게 대부분이라서 최대한 변화에 맞춰 글을 업데이트 하는 방향으로 해보겠습니다. 혹시 버전이 바뀌어 메뉴가 또 일치하지 않는 경우가 있다면 댓글로 달아주시면 바로 반영 하도록 하겠습니다. 아래의 문서를 참고 했습니다. https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools Intro 스프링 부트 뿐만 아니라 웹 프로젝트를 할 때에 단..

SpringBoot ) Application.properties 혹은 .yml 프로필 별로 따로 사용하기 (Eclipse, IntelliJ IDEA)

SpringBoot ) Application.properties 혹은 .yml 프로필 별로 따로 사용하기 (Eclipse, IntelliJ IDEA) application.properties 가 상황에 따라 개발환경/ 배포환경 등으로 나눠서 설정이 필요한 경우가 있습니다. 필요 할 떄마다 파일을 수정해가며 하면 번거롭기 때문에 보통 여러개의 프로필을 만들어 두고 필요에 따라 사용하는게 편리합니다. application.yml (혹은 application.properties) 파일은 기본 설정 파일입니다. 후에 application-dev.yml 혹은 application-dep.yml 파일을 생성한다면 dev 혹은 dep가 profile이 됩니다. 그리고 또한 프로필에 들어간 설정들은 기존의 설정을 ov..

Spring 에서 페블 템플릿 Pebble template 사용하기 2 ) Spring boot 프로젝트에서 사용하기

https://shanepark.tistory.com/197 글에 이어지는 내용입니다. 본 포스팅은 https://pebbletemplates.io/wiki/guide/spring-boot-integration/ 를 토대로 작성되었습니다. 프로젝트 생성 일단 스프링 부트 프로젝트를 생성 합니다. Spring Starter를 이용하면 쉽게 생성 할 수 있습니다 Maven 프로젝트로 생성 했지만 Gradle로 해도 무관합니다. 적당한 Location에 적당한 이름으로 프로젝트를 생성합니다. ​ 간단하게 Sprinig Web만 추가해서 생성하겠습니다. Finish 를 눌러 프로젝트를 생성 합니다. Dependency 추가 Maven io.pebbletemplates pebble-spring-boot-start..

Spring 에서 페블 템플릿 Pebble template 사용하기 1 ) 기본 사용

Pebble Template이란 ? Pebble은 PHP의 유명 템플릿 엔진인 Twig 에서 영감을 받았으며 Python Jinja의 Template Engine 문법과 유사한 Java 템플릿 엔진 입니다. template을 상속 하는 기능과 읽기 쉬운 문법이 특징인 서버사이드 템플릿 엔진 입니다. 기본 사용 첫 글에서는 간단하게 https://pebbletemplates.io 의 Basic Usage를 하나씩 따라해보겠습니다. 1. dependency 추가 Spring Boot 에서는 pebble-spring-boot-starter 를 추가해서 사용하지만, 일단 Basic Usage에 쓰인 대로 따라가보겠습니다. Maven io.pebbletemplates pebble 3.1.5 Gradle compi..

SpringBoot + PostgreSQL + Hibernate ) 간단한 게시판 만들기

SpringBoot + PostgreSQL + Hibernate ) 간단한 게시판 만들기 앞으로 맡을 프로젝트에서 SpringBoot 와 PostgreSQL 그리고 Hibernate를 기술스택으로 사용하게 될 것 같습니다. 여태 배웠던 Spring Legacy Project + Oracle Database + Mybatis 환경에서 조금씩은 달라 지겠지만, 크게 다를 것은 없기 때문에 금방 적응 할 수 있을 것이라고 믿습니다. 그래도 조금이라도 빨리 해당 기술들에 대한 막연함을 해소하고, 업무에 대한 준비를 갖추고 싶어 틈틈이 시간나는 대로 가장 기본적인 게시판을 만들어 보았습니다. 데이터 검증 과정이 없고 화면 구성이 투박하지만, 그 만큼 쉬운 코드로 간단하게 작성 해 보았습니다. 제일 먼저 할일은 데..