스프링

스프링

    데이터 베이스 버전 컨트롤 Flyway

    Spring에서 초기 테이블과 데이터 관리를 위해서 data.sql과 schema.sql을 사용하였다. 하지만 테이블 스키마가 변경되거나 필수로 초기에 들어가야하는 데이터들이 추가되거나 수정되었을 때 히스토리 관리가 잘 되지 않았다. 특히 서로 교류가 잘 되지 않은 경우에서는 컬럼이 추가되거나 무엇이 변경되었는지 알지 못해서 문제를 유발할 수 있기에 이를 관리 할 수 있는 무언가가 필요했다. 그래서 Redgate에서 제공하는 Flyway를 사용해보기로 했다. 우선 내 개인 프로젝트인 timeline에 적용시켜봤다. 데이터베이스 버전관리 Flyway https://flywaydb.org/ 동작 방식 Flyway가 버전관리를 하기위해서 테이블이 생성된다. Flyway가 버전관리는 이 테이블에 데이터베이스의 ..

    Spring boot 모니터링 Actuator 소개 및 설치

    spring acturator를 통해서 스프링 애플리케이션의 작동여부등을 체크해보자. 설정 우선 gradle 라이브러리를 추가한다. compile 'org.springframework.boot:spring-boot-starter-actuator' 그리고 기존에는 application.properties나 yml에 아래 옵션을 설정해줘야 했지만 기본적으로 설정이 되어있다. endpoints.health.enabled=true 하지만 이는 Spring boot 2.0에서 다음으로 변경되었다. (https://stackoverflow.com/questions/48900892/how-to-enable-all-endpoints-in-actuator-spring-boot-2-0-0-rc1) How to enable..

    Spring Reactive Web Application

    Sprint 5에서 리액티브 프로그래밍을 지원하는 웹 애플리케이션을 만들 수 있다. 리액티브 프로그램이란? 이전시간에 정리했었지만 스프링 리액티브 프로그래밍을 들어가기 전에 간단하게 정리해 보자. 일반적으로 리액티브 프로그래밍은 비동기, evnet-driven 방식으로 non-blocking 하는 프로그래밍으로써 일반적인 시스템 보다 작은 작은 쓰레드 수가 필요하다. 그럼 왜? 비동기-논블록킹 리액티브 개발이 가능. 기존 멀티쓰레드 블로킹 방식과는 다르게 서버의 응답에 의지하지 않는 효율적 개발이 가능. 서버간에 호출이 잦은 마이크로 서비스에서 사용됨 Spring Web Reactive Module (Servlet 3.1 이상부터 지원) Spring Framework 5는 spring-web-reacti..

    Spring reactor Mono와 Flux 정리

    지금까지 Spring5에서 추가되었던 리액트 프로그램을 사용하여 간단한 프로그램을 만들어 봤지만 정확하게 Mono와 Flux에 차이와 정의를 정리하지 못한 것 같다. 이번기회에 두 개의 정확한 차이와 사용방법등을 정리해보자. 리액티브 프로그래밍 비동기 블록킹 프로세스로 동작하는 애플리케이션을 논블록킹 프로세스로 동작하기 위해서 지원하는 프로그래밍. (현재 node.js의 동작방식과 유사) 기존 Spring 블록킹 방식 웹에서 서버에 요청이 왔을때 서버는 요청에 대한 적절한 응답을 보내야 하는데 만약 작업이 오래 걸릴 경우에는 요청에 대한 응답이 모두 종료될 때까지 블록킹된다. Spring에서는 그래서 동시 요청 처리를 위해서 멀티 thread를 지원한다. 그러면 하나의 작업이 thread에서 진행되고 다..

    [공유] spring에서 생성자 의존성 주입

    spring에서 사용하는 의존성 주입에 경우 @Autowired만을 사용하면 나중에 테스트 케이스를 만들때 어려움이 생긴다. 그래서 생성자 주입을 사용하는데 잘 정돈된 사이트가 있어 공유한다. http://multifrontgarden.tistory.com/214

    스프링 부트에서 사용하는 JPA 기능 정리

    스프링 프레임워크에서 제공하는 JPA는 별도의 구현 클래스 없이 인터페이스만을 사용할 수 있도록 제공한다. 제공되는 인터페이스 JpaRepository는 실행시점에 자동으로 인터페이스 내용을 연결하는 엔티티에 맞게 자동으로 구현해준다. 만약 스프링 JPA 인터페이스에서 제공하지 않는 기능을 사용하고 싶을 때는 메서드명을 특정한 규칙대로 만들어서 사용하면 인터페이스가 알아서 그 이름에 맞는 JPQL을 만들어서 실행해준다. 스프링 JPA 인터페이스는 Mysql같은 RDBMS 뿐만 아니라 Mongodb, Redis와 같은 NoSQL에도 동일한 인터페이스를 사용해서 기능을 사용할 수 있도록 제공해준다. 공통으로 사용할 수 있기에 아주 편리하다. 우선 스프링 부트에 JPA를 사용하기 위해서 Gradle에 라이브러..

    연관관계 매핑 - 다대일 매핑 (단반향)

    연관관계 매핑을 해야하는 경우가 많다. 예를 들어 학생을 가지고 학생에 소속 반을 찾거나 반을 사용해서 학생들을 찾거나 할 때가 있다. 이 때 양방향과 단방향 관계가 존재하는데 아래의 객체 형태를 보면 이해가 더 쉽다. 단방향 class Student { Class class; } class Class {} 양방향 class Student { Class class; } class Class { Student student; } 이중에서 먼저 단방향 연관 관계에 대해 먼저 공부해보자. 단방향 연관관계 학생과 반이있다. 학생은 하나의 반에 소속된다. 학생과 반은 다대일 관계이다. (학생이 다, 반이 일) 학생 테이블을 담는 객체는 Student, 반 테이블을 담는 객체는 Classes를 사용한다. 학생 테이..

    Spring Boot Cross Domain 처리

    웹 브라우저에서 같은 도메인을 사용하는 서비스에 대한 요청은 정상적으로 처리가 되나 도메인이 같지 않은 서비스에 요청을 할경우에 오류가 발생한다. 이는 동일 출처 정책(Same Origin Policy) 라는 정책을 두어 다른 도메인의 서버에 요청하는 것을 보안 문제로 간주하고 이를 차단하는 것 때문에 발생한다. Spring Boot에서 간단한 방식으로 해결할 수 있다. 1. 요청에 @CrossOrigin 애노테이션 붙히기12345@GetMapping("/greet")@CrossOriginpublic Greet greeting() { return new Greet("test");}Colored by Color Scriptercs 2. 특정 도메인에서 오는 요청만 받고 싶을 경우.-> 특정 도메인에서 오는..

    스프링 웹플럭스(spring webflux)를 활용한 간단한 리액티브 마이크로 서비스

    자바 리액티브 프로그래밍은 리액티브 스트림 명세를 바탕으로 하고 있다. 리액티브 스트림 명세에는 컴포넌트 사이의 비동기 스트림 처리나 이벤트 흐름을 Non Blocking 방식으로 처리하기 위한 문법을 정의한다. 일반적인 옵저버 패턴과 달리 리액티브 스트림에는 시퀀스의 처리, 완료 알림, 실패시 backpressure 적용 등이 추가된다. backpressure는 받는 컴포넌트에서 보내는 컴포넌트에게 얼마만큼의 데이터를 소화할 수 있다고 알려줄 수 있다. 그래서 받는 컴포넌트에서 처리될 준비가 됐을 때만 데이터를 받을 수 있다. 그래서 서로 속도가 다른 컴포넌트 사이의 통신을 할 때 유리하다. 스프링 프레임워크 5 web flux는 Reactor 리액티브 스트림 명세를 기반으로 되어있다. 간단한 Spri..

    리액티브 스트림의 이해

    리액티브 스트림은 총 4개의 인터페이스로 구성되어 있다. ㅁ 발행자(Publisher) - 데이터의 소스를 가지고 있으며 Subscriber의 요청이 오면 데이터를 발행한다. 구독자는 발행자에 대한 구독을 추가할 수 있다. Subscribe 메소드를 통해서 구독자를 추가할수 있다.123public interface Publisher { public void subscribe(Subscriber

    리액티브 마이크로 서비스 정리

    동일한 마이크로서비스는 서로 공유 및 통신하게 되어있다. 예를 들면 주문과 결재, 배송서비스들은 서로 공유되어있다. 이 서비스들의 호출 관계를 단순하게 동기 방식으로 호출하게 된다면 강한 의존성을 가지게 되기 때문에 마이크로 서비스의 강점을 충분하게 살릴 수 없다. 결국 모노토릭 서비스와 크게 다를게 없어진다. 그래서 도입되는 개념이 리액티브 마이크로 서비스이다. 리액티브 프로그래밍은 회복성(resilient), 응답성(responsive), 메시지 기반(message driven), 탄력성(elastic) 이렇게 4가지 기둥이 존재한다. 서로간에 마이크로서비스가 독립적으로 되어있기 때문에 특정 부분에 문제가 발생하면 해당 마이크로서비스의 복제본이 이를 대체할 수 있다. 하지만 이렇게 격리가 되었다고 해..

    Spring boot hibernate jpa에서 Auditing 사용 - update, create 시간 자동 변경

    엔티티를 만들고 데이터를 삽입하고 조작할 때 create date와 last modified date를 별도로 업데이트 해주면서 관리하였다. 하지만 이번에 JPA를 공부하면서 별도의 작업 없이 JPA의 Auditing 기능을 사용하면 데이터를 삽입하고 수정할 때 자동으로 날짜를 수정하도록 할 수 있는 기능이 있는 것을 확인했다. 1. ConfigurationJPA Auditing을 사용하기 위해서는 기능을 자동으로 활성화 해주는 어노테이션을 붙혀주면 된다. 처음에는 @Configuration을 사용하는 클래스에 함께 선언해주었는데 정상적으로 적용이 되지 않아서 @SpringBootApplication을 사용하는 곳에 적용했더니 성공적으로 적용되었다. 123456789101112131415161718192..

    Spring Application Test 정리

    Spring에서 Junit을 통해 테스트하는데 익숙해져있다. 이 방식과 더불어서 Spring의 MockMvc를 이용하여 Web Layer를 테스트 하는 방법에 대해 공부해보자. 우선 테스트를 진행하기 위해서 Spring-boot-starter-test를 추가해야한다. Gradle1testCompile("org.springframework.boot:spring-boot-starter-test")cs 그러면 테스트 클래스 파일에 @SpringBootTest와 @RunWith가 추가된다. @SpringBootTest는 Spring Boot에서 주 구성 클래스를 찾아서 Spring Application Context를 시작하도록 하는 어노테이션이다. Controller 테스트를 진행할 떄 서버를 가동시키고 Te..

    Java 9 이후 deprecated된 Spring @PostConstruct와 @PreDestory 대안소개

    이 둘은 Bean의 생성 (생성자가 호출 된 후)과 소멸 시점에서 실행할 부분을 정의할때 사용한다. 하지만 @PostConstruct와 @PreDestory 어노테이션은 Java 9에서 Deprecated 되었고 Java 11에서는 제거될 예정이다. 그래서 이와 같은 동작이 필요할 때 사용할 수 있는 대안을 소개한다. InitializingBean, DisposableBean 인터페이스 구현 두 개의 인터페이스를 구현하면서 afterPropertiesSet()과 destroy() 메서드를 재정의하면서 deprecated된 두개의 어노테이션을 대신할 수 있다. 123456789101112131415161718192021@Servicepublic class UserService implements UserS..

    Spring Boot에서 src/main/resource 파일 접근 방법 및 주의사항.

    Spring Boot를 이용해서 빠르게 프로젝트를 제작해야 할일이 있어서 작업을 하던 도중에 src/main/resource 위치에 파일에 접근이 필요했다. 그래서 ClassLoader를 사용해서 resource를 획득한 후 해당 경로를 얻어 Paths 객체를 만들고 파일을 읽었다. 로컬에서 개발할 때는 정상적으로 읽어졌다. 1String jsonTxt = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("course.txt").toURI())));cs 하지만 war로 빌드하고 서버에 올리고 나서 문제가 발생했다. 해당 파일 자체를 읽지를 못했다. 왜그럴까? 한참 고민하다가 인터넷 검색해서 한가지 글을 보았다...

    Mybatis에서 쿼리 작성 시 부등호 사용하면 발생하는 Error 수정

    Mybatis에서 사용하는 쿼리중에 < > 와 같은 부등호가 들어가게 되면 에러가 발생한다. [에러내용]"The content of elements must consist of well-formed character data or markup." 이를 해결하기 위해서는 부등호를 사용하는 쿼리는 을 감싸주어야 한다. 12345678910

    Spring에서 get으로 한글 데이터를 requestparam으로 받을 때 깨지는 현상

    업무 진행 시 Spring에서 페이지 이동 시 같이 전송한 parameter 값을 controller에서 받을 때 깨지는 현상이 발생했다. 그래서 이를 해결하기위해 전송받은 데이터를 UTF-8로 인코딩을 진행하였더니 정상적으로 한글을 받아서 처리할 수 있었다. 1new String(bizName.getBytes("8859_1"), "UTF-8")cs

    lombok 사용시 Generating equals/hashCode implementation 에러 수정방법

    lombok 사용할 때 다음과 같은 에러를 본적이 있을 것이다. [에러내용]Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type. 이 에러는 상속을 받은 자식클래스에 발생하는 에러로서 다음과 같이 해결해줄 수 있다 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748package c..

    mac환경에서 spring boot에 lombok 설치하기

    Lombok 소개 lombok은 모두다 알다시피 getter, setter, construct등 계속해서 추가되어야하는 코드를 어노테이션을 이용하여 자동으로 생성해주는 기능을 제공하는 라이브러리이다. 설치홈페이지에 우선 jar 파일을 다운로드 받는다.https://projectlombok.org/download 다운받은 jar파일을 실행하면 자동으로 ide를 찾아서 설정해준다.설치를 완료하면 다음과 같이 ini에서 설치 여부를 확인할 수 있다.

    Maven 다운로드 및 환경변수(Path) 등록방법

    Spring boot cli에서 maven관련 명령어를 사용을 위해서는 Maven이 환경변수 되어있어야 한다. Maven을 윈도우에서 환경변수로 설정하는 방법을 알아보자. 1. 다운로드 경로 : https://www.apache.org/dyn/closer.cgi 아파치 메이븐의 다운로드 페이지가 변경되어서 조금 헷갈린다. 잘모르겠으면 여기서 받으면 된다. http://mirror.navercorp.com/apache/maven/maven-3/3.5.3/ 2. 환경변수 등록 1) 먼저 시스템 변수에서 MAVEN_HOME을 설정해준다. (이미지 참고) 2) Path에서 편집을 눌러 다음과 같이 설정한다. %MAVEN_HOME%\bin 만약 이렇게 설정하여도 정상동작 하지 않으면 다음과정을 확인한다. 1) S..

    Spring boot에서 Spring security를 사용하여 로그인 하기

    스프링 부트를 공부하면서 스프링에서 제공하는 spring security를 통해 로그인 기능을 편리하게 구현할 수 있다는 것을 알았다. 기존에 회사에서는 interceptor 기능을 통해서 로그인 기능을 만들어서 사용했다. 둘다 좋은 방식이지만 spring security를 사용하면 csrf 공격도 막을 수 있어서 한번 사용해봐도 좋을 것 같다. 1. 라이브러리 pom.xml 1234 org.springframework.boot spring-boot-starter-securityColored by Color Scriptercs 2. SpringSecurityAdaptor -> 스프링 시큐리티에 필요한 내용을 정의하는 configuration을 생성해야한다. -> WebSecurityConfigurerAd..

    spring boot에 https 접속 적용하기

    구글에서 http에 대한 모든 접속을 보안 경고를 표시하게 되면서, 모든 접속에 https 접속이 필수가 되었다. 스프링 부트를 접해보면서 스프링에서는 조금 과정이 귀찮았던 https 접속을 적용하는게 얼마나 편해졌는지 알아보았다. 1. application.properties 설정 #ssl 설정 server.port=13443 server.ssl.key-store=classpath:keystore.jks server.ssl.key-store-password=test server.ssl.key-password=test 2. keystore 만들기 -> ssl을 적용하려면 자가 서명 키스토어가 필요하다. 만약 인증기관에서 인증서를 발급받은 경우 그냥 그 파일을 사용하면 된다. 위의 명령어를 사용하여 src..

    Spring에서 url 요청하는 RestTemplate 설명

    Spring 기반 프로젝트 진행 시 URL을 요청할 때가 있다. 이를 Apache의 HttpClient 라이브로리를 사용하여 할 수 있지만, 스프링 프로젝트에서는 SpringTemplate를 사용하여 쉽게 요청할 수 있다. (httpClient와 RestTemplate의 차이는 하단의 링크참조) 사용법은 아주 간단하다. 각 요청 Method 마다 하단의 메소드를 이용하여 호출하기만 하면된다. 1. Get 12345RestTemplate restTemplate = new RestTemplate();String fooResourceUrl = "http://localhost:8080/spring-rest/foos";ResponseEntity response = restTemplate.getForEntity(f..

    spring boot에서 jsp사용하기

    spring framework만 사용하다가 요근래 대다수에 회사에서 spring-boot를 사용하는 것을 확인하고 spring-boot에 대해 공부를 해보았다. 확실히 spring-boot를 사용하면 설정이 엄청 간단해서 개발자가 설정에 집중하는게 아니라 비즈니스 로직에만 딱 고민할 수 있도록 되어있어서 진짜 편한것 같다. 그래서 기존에 내가 하고 있는 wedulpos 프로젝트를 spring-boot로 마이그레이션 하는 작업을 거쳤는데 그 사이에 어려운 부분이 있었다. 스프링에서는 jsp를 사용하는 것이 어렵지 않았으나, 기본적으로 spring-boot에서는 jsp 사용이 기본이 아니다. 그래서 설정을 위해서는 몇가지 변경을 해주어야한다. 1. pom설정 - jstl 사용을 위한 라이브러리 추가 1234..

    spring boot 재시작 없이 frontend(html, js..) 변경내용 사용하기

    spring boot를 공부하면서 html요소가 자동으로 변경되지 않아서.. 계속 껏다켜야해서 너무 불편했다. 그래서 구글링 하던중 방법을 알게되어 적어본다. 1. pom.xml 추가 12345 org.springframework.boot spring-boot-devtools trueColored by Color Scriptercs 2. debug 모드로 실행 3. eclipse 설정 중 Build Automatically 설정 여부 확인 (기본으로 사용으로 설정되어 있음)

    Spring Interceptor와 Filter에서 POST 방식으로 전달된 JSON 데이터 처리하기

    이번 회사 프로젝트에서 진행할 때 parameter값이 아니라 Josn 데이터가 필요할 때가 있었다. 이를 위해서는 HttpServletRequest에서 InputStream으로 데이터를 추출해야한다. 하지만 HttpServletRequest에서 InputStream을 한번 추출하게되면, Controller에서 parameter를 매핑하려고 데이터를 바인딩할 때 다음과 같은 오류가 발생한다. 이는 톰캣에서 막아놓았기 때문이다. [에러내용] 12java.lang.IllegalStateException: getReader() has already been called for this requestorg.springframework.http.converter.HttpMessageNotReadableExcept..

    Java Json Library Jacson Annotation 소개

    restFul API를 만들다 보면, 어떤 항목을 serialize 제외하거나 null인 항목은 제외하거나 하는 작업이 필요로 할 때가 있다. 이를 Jackson 라이브러리의 Annotation을 사용하여 하는 방법을 확인해보자. [Maven 셋팅] 1234567891011 2.9.2 com.fasterxml.jackson.core jackson-databind ${jackson.version} Colored by Color Scriptercs 예제로 사용될 Student Dto 클래스이다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647package com.wedul.common.dto; /** *..

    스프링 DispatcherServlet 설정 방법

    DispatcherServlet Spring MVC는 dispatcherServlet을 사용하기 위해서는 web.xml에 정의를 해주었어야 했다. 하지만 web.xml에 설정하지 않고도 다른 Java 파일로 설정할 수 있는 방법이 있다. 기존의 web.xml에 설정방식은 다음과 같다. 12345678910111213141516 dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/dispatcher-config.xml 1 dispatcher /Colored by Color Scriptercs XML에 정의한 서블릿 설명은 다음과 같다. 1. 이름은 dispatcher 이다. 2. o..

    Spring Context 종류 및 특성

    Spring Context 종류 및 특성 Spring 프로젝트를 처음 생성할 시 root-context.xml과 servlet-contex.xml 두 개가 생성됩니다. 이 두개가 각각 하는일이 지정되어 있는데 무심코 사용하는 경우가 많습니다. 이 둘의 차이점에 대해서 설명하겠습니다. spring은 multi context 환경을 제공해주는데 기본적으로는 root context와 servlet context로 구분됩니다. 1. servlet-context web application의 client의 요청을 받기 위한 entry point 입니다. 따라서 해당 context의 설정에는 요청에 대한 처리를 해줄 controller의 매핑설정(handler mapping)과 요청처리 후 view처리를 어떻게 할..

    Spring Rest Client Feign 소개

    Feign는 넷플릭스에서 개발된 HTTP 클라이언트다. Feign은 HTTP API 클라이언트를 간단하게 제공한다. Feign을 사용하기 위해서는 인터페이스를 선언하고, 어노테이션화 하면 이를 런타임에서 실제 구현을 제공된다. Feign 라이브러리 추가 - feign-okhttp는 request를 만들기 위해서 내부적으로 Square OkHttp 클라이언트를 사용하기 위해 사용 - feign-gson은 JSON 처리기로서 Google Gson을 사용하기 위해 로드 - feign-slf4j는 request들을 로깅하기 위해서 라이브러리 사용 123456789101112131415 io.github.openfeign feign-okhttp 9.3.1 io.github.openfeign feign-gson 9..