공부/Spring 10

JPA data.sql로 초기화 시 에러 해결방법 Error creating bean with name 'dataSourceScriptDatabaseInitializer'

spring에서 jpa를 사용 시 @Entity 어노테이션을 사용하면 ddl이 자동으로 생성되고(모드 설정 가능) 초기 데이터 생성을 위해 resource 디렉토리 아래 data.sql 파일을 insert 문을 넣어 사용하곤 한다. 이렇게 줄곧 사용해 왔으나 최근에 갑자기 에러를 마주하게 되었고 간신히 해결하게 되어 그 해결 방법을 기록하기로 했다. 스프링 버전이 올라가면서 생긴 문제로 2.4 버전에선 잘 되던 것이 같은 방법으로는 2.5에는 에러가 났다. 먼저 스프링 부트 2.4 버전을 보면 아래와 같다. Member클래스에 @Entity 어노테이션을 사용하여 members 테이블을 자동 생성하게 하였다. 그리고 초기 데이터를 넣기 위해 data.sql에 다음과 같이 insert문을 작성하였다. 실행을..

공부/Spring 2021.08.29

jackson으로 응답 값 직렬화할 때 속성값의 첫 단어가 한 글자인 경우

json형식의 응답으로 dDay라는 키를 반환하다가 문제가 생겨서 이 글을 작성하게 되었다. (아래 코드는 Github에서 확인이 가능하다.) 먼저 반환하려는 객체는 다음과 같다. public class FooDto { private int dDays; public int getDDays() { return dDays; } } 기대하는 응답 값은 다음과 같다. { "dDays": 0 } 하지만 실제로 응답된 값은 이러하다. { "ddays": 0 } 이를 기반으로 테스트 코드를 작성해 보았다. @WebMvcTest public class FooControllerTest { @Autowired private MockMvc mvc; @Test public void jsonSerializeTest() thro..

공부/Spring 2021.06.28

Spring @Order 로 Bean 순서 정의하기

스프링의 @Order 어노테이션은 컴포넌트나 빈의 로드 순서를 정의할 수 있다. 같은 타입의 빈이 Autowired 될 때 그 순서를 @Order를 이용하여 정의하는 것이다. 예시 코드는 아래와 같다. 오른쪽 테스트 코드를 보면 List 타입을 Autowired 할 때 @Order에 정의된 순서대로 불러오게 된다. @Order를 자세히 보게 되면 값에는 정수형이 들어가고 기본 값은 Ordered.LOWEST_PRECEDENCE이다. Ordered.LOWEST_PRECEDENCE를 보게 되면 아래와 같고 정수의 최댓값을 나타내며 가장 낮은 우선순위를 뜻한다. 가장 우선순위를 높게 하기 위해선 정수형의 최댓값인 Ordered.HIGHEST_PRECEDENCE를 이용하면 된다. @Order의 값이 중복될 경우..

공부/Spring 2021.02.15

Spring @Profile 로 환경에 따라 다르게 설정하기 (+ @ActiveProfiles 로 테스트 하기)

@Profile 환경에 따라 다르게 동작해야 하는 경우가 있다. 이 때 @Profile이라는 어노테이션을 활용하면 간편하게 적용이 가능하다. 먼저 product, development, test 환경이 있고 각각의 환경에서 발송 기능 사용시 다르게 동작해야 한다고 하자. 먼저 발송하는 곳 소스이다. 발송하는 곳에서 환경에 따라 분기가 되는 것은 적합하지 않다고 생각한다. 그래서 저 Sender 객체를 생성하는 곳에서 분기가 되어야 한다. 그 과정에서 @Profile을 사용한다. 위 코드만 봐도 @Profile이 어떻게 사용되는지 대충 알 수 있다. 복수도 지원하고 산술연산자도 지원한다. 어플리케이션 실행 시 각각의 profile에 따라 다른 값이 빈이 동작하는 것을 확인 할 수 있다. @ActivePro..

공부/Spring 2021.01.08

Spring boot test 경로가 다른 패키지 테스트 시 오류

어느 날 마주한 에러 문구 Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test 아래 그림과 같이 패키지를 여러 개 두는 경우가 있다. 어플리케이션 실행 시는 component scan 어노테이션을 이용하여 다른 패키지도 빈 생성이 가능하다. 하지만..

공부/Spring 2021.01.07

Spring Data Rest 알아보기

개요 hateoas에 대해 관심을 갖고 찾던 중 spring-data-rest와 spring-data-jpa로 간단하게 crud가 가능하다는 것을 알게 되었다. (hateoas도 적용된다) 그래서 어떤것인지 확인해 보기 위해 간단하게 살펴 보았고 그 내용을 공유한다. 레이어가 간단하다. controller와 service 레이어가 없다. entity와 repository만으로 rest api가 생성된다.! 이 두개만 있으면 끝이다. 소스도 간단하다 package com.byeongukchoi.springdatarestexample.domain; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import o..

공부/Spring 2020.11.20

옵셔널(optional)과 람다(lambda)를 이용하여 JpaRepository에서 예외 처리하기

spring에서 JpaRepository의 findById를 이용하면 Optional 타입으로 반환이 된다. 처음에는 불편하기만 하였으나 이제 많이 편해져서 혹시라도 아직 불편하게 사용하는 사람들을 위해서 그 방법을 공유한다. 아래 4가지의 코드는 같은 로직을 가독성이 좋게 코드를 조금씩 수정한 것이다. 가나다 많이 이상하고 불편했던 경우 Optional optinalUser = userRepository.findById(id); // check for null if(optinalUser.isPresent()) { User user = optinalUser.get(); } else { throw new ResourceNotFoundException(); } 옵셔널 타입이 아닌 일반 객체로 받았을 경우 U..

공부/Spring 2020.11.17

Spring boot와 MySQL을 Docker 컨테이너로 올리기

Spring boot로 어플리케이션 개발하던 중 도커를 이용하여 동작시키면 어떨까 하여 진행하였고, 그 과정에 여러 가지 일들을 기록하고 공유하고자 한다. 먼저 어플리케이션은 spring boot로 되어있고 데이터베이스는 mysql을 사용한다. mysql과 spring boot를 도커 컨테이너로 각각 올려야 한다. 이 과정에서 docker compose라는 것을 사용하여 같이 동작시키고 한 네트워크 안에서 만들 수 있으나, 데이터베이스와 어플리케이션을 분리하여 관리하고 싶어서 docker composer를 사용하지 않았다. 각각의 docker 컨테이너를 실행시킬 때 문제는 컨테이너 간 네트워크가 연결되어야 한다는 것이다. 도커 네트워크에 대해서는 아래 블로그에 자세하게 나와 있어 확인이 가능하다. jun..

공부/Spring 2020.08.22

스프링 프레임워크 어노테이션 기반 의존성 주입 (@Autowired, @Resource, @Inject)

어노테이션 기반으로 의존성 주입은 스프링 설정파일(ex. applicationContext.xml)에 주입하려는 객체를 찾아 의존성을 주입한다. 스프링 설정파일에 추가 해야할 사항 -- 여기 -- 여기 @Autowired 타입이 일치하는 객체를 자동으로 주입 (주로 가장 많이 사용됨) 생성자, 속성, 메서드위에 어노테이션을 선언하여 사용할 수 있다. 단, 속성이나 메서드 위에 선언하여 사용시 디폴트 생성자를 명시 해야한다. 스프링 설정파일에 중복된 값이 있을 경우 Qualifier를 사용한다. @Qualifier("객체id값") required 속성 @Autowired(required = false) 스프링 설정 파일에 주입할 객체가 없을 경우 에러 처리 하지 않음 @Inject @Autowired와 비..

공부/Spring 2020.03.08

스프링 프레임워크 기본 디렉토리 구조 (Spring Framework directory structure)

프로젝트 폴더/ ㄴsrc/ ㄴmain/ ㄴjava/ -- 자바 파일 폴더. (개발 시 생성되는 자바 파일들 저장됨) ㄴresources/ -- 자원 관리 폴더. (스프링 설정파일, 프로퍼티 파일 등) ㄴwebapp/ -- 웹 관련 폴더. (html, css, js 등) ㄴWEB-INF/ ㄴspring/ -- 스프링 설정 파일 (스프링 컨테이너 생성) ㄴappServlet/ ㄴservlet-context.xml ㄴroot-context.xml ㄴviews/ ㄴhome.jsp ㄴweb.xml -- 웹설정 파일 ㄴtest/ pom.xml -- 메이븐 설정 파일

공부/Spring 2020.03.05
728x90
반응형