Spring으로 Rest Api를 개발할때 클라이언트와 데이터를 JSON으로 주고받고 하는데 이때 사용되는 어노테이션중 하나가 @RequestBody이다. 클라이언트측에서 요청데이터를 body에 담고 content-type을 application/json으로 설정 해줘야 동작된다. 이제 그 방식을 알아보자 Request DTO 생성 및 스크립트 파일작성 클라이언트에서 POST 방식으로 요청데이터를 JSON으로 직렬화 한 후 content-Type을 application/json지정하여 요청한다. 서버에서는 해당 데이터를 받아드릴 RequestDTO 객체를 생성한다. Controller 작성 Post요청을 받는 메서드를 작성한뒤 매개변수에 RequestDTO 객체를 인자로 받는다. 이때 @RequestBo..
최근에 이 글을 작성하면서 Spring 애플리케이션을 jar로 실행시 Java RunTime 시점에 System 변수를 주입하는법에 대해 정리를 해보았는데 이번엔 jar가 아닌 war로 배포할때 Java System변수를 추가하는법에 대해 알아보자. IDE에서 구동 Eclipse나 STS에서 구동할때 Server 탭 > Tomcat Server 클릭 > Open launch configuration 클릭 > Arguments 탭 클릭하게되면 VM arguments란에 -Dname=value를 작성해주면 된다. Tomcat을 구동하게되면 Console에 해당 시스템변수가 주입된걸 볼 수 있으며 System.getProperty(key) 메서드로 확인해보니 정상적으로 출력되었다. Tomcat Director..
이번장에는 Spring Boot 애플리케이션을 jar가 아닌 war로 배포하는법에 대해 알아보자. Spring Boot는 Embedded Tomcat이 내장되어 있어 jar로 배포가 가능하지만 프로젝트 환경상 외부 Tomcat을 이용해 배포해야할 경우가 있다. 외부 Tomcat을 이용하여 Tomcat Probe Manager로 배포를 해볼 예정인데 Tomcat Probe Manager란 Tomcat의 상태를 모니터링할 수 있는건데 현재 몇개의 쓰레드가 가동중이며 JVM 메모리를 얼마나 사용하는지에 대한 정보를 볼 수 있는데 자세한건 아래에서 설명하겠다. SpringBootServletInitializer 클래스 상속 먼저 SpringBootServletInitializer 라는 추상클래스를 상속받는다. ..
저번글에서 Spring Boot로 Configuration Properties 클래스를 만들어보았는데 이때 .properties 파일에서는 한글이 깨진현상이 나온적이 있는데 왜 발생이 되었고 어떻게 해결을 했는지 정리해보고자 한다. 한글깨짐현상 application.properties에 한글데이터를 넣었다. 테스트를 돌려보니 한글데이터가 깨져있는걸 확인할 수 있었다. 이 문제를 해결하기위해 @PropertySource라는 어노테이션을 이용해 encoding을 설정해줄수 있는데 한번적용해보았다. @PropertySource 어노테이션 추가 해당 어노테이션을 추가해도 한글은 계속 깨졌다. 아마 어딘가에 encoding방식을 ISO_8859_1로 세팅하는곳이 있는것같다. 원인 Spring Boot에서 Prop..
Spring으로 개발을 할때 properties나 yml 등 설정파일에 데이터를 입력하고 그 데이터를 JAVA객체와 매핑하여 사용할 때가 발생하곤 한다. 이번장에는 Spring Boot에서 기본적으로 제공해주는 Properties 클래스말고 직접 Properties 클래스를 만들어보자. 위에서 언급한 Spring Boot에서 기본적으로 제공해주는 Properties 클래스에 대해 간략히 설명하자면 기존 Spring Legacy로 개발환경을 세팅할때 개발자는 DB Connection을 하기위해 DataSource Bean 설정을 일일이 하나하나 다 잡아줘야했지만 Spring Boot에서는 이러한 기능들을 자동으로 설정해주며 각 설정들에 대해 Properties 클래스를 제공해준다. 내장 Tomcat, My..
Spring에서는 인증 및 인가의 기능을 제공해주는 JAVA EE 프레임워크인 Spring Security를 제공한다. 이 프레임워크를 이용하게되면 여러사용자에대해 특정 요청에 대해 접근제한을 둘수가 있는데 Security에서는 이러한 부분을 동적으로 처리할 수 있는 기능을 제공하는데 예제코드와 함께 살펴보자. Security 설정중 일부 해당설정은 /study/list라는 요청은 ADMIN, USER의 권한을 가진 사용자만, /study/regist는 ADMIN 권한을 가진사용자만 요청할 수 있게 설정되있다. 고객의 요구사항중에 사용자별로 메뉴에 대해 권한을 제어할 수 있는 기능을 만들어 달라고 할때가 있다. 예를들어 USER의 권한을 가진 사용자를 ADMIN 권한으로 변경을 하게되면 이 사용자는 두 ..
Spring으로 개발을 하다보면 application.properties파일 또는 application.yml파일에 공통으로 쓰이는 프로퍼티를 정의하고정의된 값을 여러 Java 파일에서 참조해서 애플리케이션 개발이 진행되는데 대표적으로 파일경로가 있다. 하지만 이 설정파일에 데이터베이스 접속정보, JWT 암호화 키, 그 외 관련된 중요한 데이터들도 들어있을 수 있는데 이러한 정보들이 외부로부터 노출될 수 있기 때문에 이 정보들을 암호화를 하거나 외부에서 접근했을때 알아보지 못하게 해야한다. 이러한 방법으로 jasypt 라는 라이브러리를 제공해는데 이 라이브러리를 이용해 예제코드와 함께 알아보도록 하자. jasypt (Java Simplified Encryption) 란? Jasypt is a java l..
Spring으로 Rest API를 개발하고 그 API에 대한 문서를 정리하여 해당 API를 사용하는 클라이언트 및 서버 개발자들에게 문서를 정리해서 공유해야하는데 이때 Swagger를 이용하게되면 이런 작업을 보다 편리하게 할 수 있고 API 문서 자동화 뿐만 아니라 UI에서 직접 API 테스트로 할 수 있다. 예제코드와 함께 기본세팅법 부터 알아보자 개발환경 Spring Boot Maven Java 11 Swagger 의존성 추가 io.springfox springfox-swagger2 2.9.2 io.springfox springfox-swagger-ui 2.9.2 Swagger를 사용하기위해 pom.xml에 해당 의존성을 추가하자 Swagger 설정 추가 import java.util.ArrayLi..
Spring으로 개발하면 주로 화면을 JSP나 Thymeleaf를 쓰는곳이 많이 있다. 이 두가지를 쓰면서 제일 많이하는 것중 하나가 session 또는 model에 데이터를 담아서 view 페이지와 함께 렌더링 하는 작업을 많이하게 되는데 이때 주의해야할 점이 있다. 예제코드를 살펴보자. 회원정보 조회 회원 아이디로 DB에서 회원정보를 조회한 후 'member' 라는 key로 session에 저장한 코드이다. 회원정보 출력 session에 저장된 회원의 이름과 주소를 출력해보았지만 저장된 정보가 나오지 않았다. 왜 나오지 않는지 스프링 코드를 한번 살펴보자 동작 살펴보기 RequestAttributes.java Spring에서는 RequestAttributes 인터페이스를 제공하는데 request와 s..
Spring으로 개발을 하면 Spring에서 제공하는 Bean이나 개발자가 직접 생성한 Bean을 외부에서 주입받아야 하는경우가 많다. 이건 스프링의 핵심기술인 DI (Dependency Injection) 입니다. 스프링에서는 DI를 하기위해 @Autowired 어노테이션이라는걸 제공해주는데 간략히 설명하자면 필드, 생성자에 주로 사용되는데 해당 어노테이션을 선언해주면 스프링이 관리하는 Bean중에서 해당 타입의 Bean이 있다면 필드 또는 생성자 파라미터 주입해주는 어노테이션이다. 일단 @Autowired의 기본적인 동작과 예제코드를 한번 살펴보도록 합니다. 테스트할 Bean객체 생성 BeanConfig.java 파일에 TestBean이라는 타입의 Bean을 생성하여 setBeanName 메서드로 '..
개발자가 개발한 기능들을 상용에 배포하기전에 개발 및 QA서버에서 테스트를 하고 정상적으로 문제가 없으면 상용에 배포하게된다. 이때 내가 개발한 코드들을 개발, QA, 상용서버에 배포할때 일일이 각 DB접속정보 및 외부데이터 (프로퍼티에 있는값)들을 서버마다 맞게 변경을 해야하는 번거로움이 있는데 Spring에서는 Profile이란걸 제공해주는데 이 Profile만 설정해두면 원하는 데이터를 원하는 환경에 맞게 배포할수 있게 해준다. 예제코드와 함께 알아보자. 환경별 프로퍼티 세팅 환경마다 다른값들은 (ex: DB정보, 파일경로 등) 프로퍼티 파일에 두고 JAVA에서 해당프로퍼티를 불러오게끔 쓰이는데 그중에 'spring.profiles' 라는 속성에 Profile을 각각 local, dev, prod로..
웹개발을 해본 개발자라면 게시판을 한번이상은 개발해보았을 것이다. 게시판을 개발하면서 각 게시글의 기본적인 데이터 및 게시글의 순번을 화면에 보여주게 되는데 이때 게시글의 순번은 각 게시글을 대표하는 번호인 DB 테이블에 INT타입의 PK값(sequence, auto_increment로 처리된 값) 을 주로 보여주게된다. 하지만 PK값이 숫자가 아닌 다른값이라던가 혹은 고객사의 요청으로 No값을 DB에있는 값이 아닌 순수 게시글의 순번을 보여달라는 요구사항이 들어올 수 있다. 실제로 필자는 이러한 요구사항을 받은적이 있다. 긴 말보단 바로 예제코드와 함께 살펴보도록 하자. 개발환경 Java 11 Spring Boot 2.3.5 Mybatis Thymeleaf 데이터 준비 게시판 테이블을 만들어서 페이징을..
Spring으로 웹개발을 하면서 유저에 대한 인증 및 권한처리를 해주어야 할 때가 있다. 아래는 해당 예시다. Authentication(인증) : 인증이 되지않은 유저는 서버에 요청을 보내도 서버에선 요청에 대한 응답을 하지않는다. (ex. 비 로그인 사용자) Authorization (인가) : 인증은 되었지만 서버에 요청을 보내도 권한이 없으면 요청에 대한 응답을 하지않는다. (ex. 일반권한을 가진유저는 관리자권한만이 액세스 할 수 있는곳에 요청을 보내도 정상적으로 응답을 받지못한다) Spring Boot에서는 이처럼 잘못된 요청을 하게되면 default로 Whitelabel Error Page를 보여주게 된다. 존재하지않는 리소스에 요청을 한다던가, 인증이 되지않은 유저가 요청을 한다던가, 서버..
저번장에는 Security의 기본세팅에 대해 정리해보았는데 이번에는 Security에서 제공해주는 Remember-me이 무엇인지 알아보자. Spring으로 웹개발을 하면서 자동로그인 기능을 구현할 때가 있다. 그때 Security에서 제공해주는 Remember-me가 있다. 이 기능을 활용하면 쉽고 간단하게 자동로그인을 구현할 수 있는데 이번장에서 예제코드와 구현시 주의사항에 대해 알아보자. 로그인 폼에 자동로그인 checkbox 생성 다음과 같이 로그인 폼에 name='remember-me' 라는 checkbox를 추가하였다. 자동로그인 기능을 활용하기위해 checkbox에는 정해진 value값을 세팅해줘야한다. 위와 같은 파라미터값이 존재하지않으면 자동로그인을 체크한 뒤 로그인을 해도 유지가 되지않..
이번장에는 Spring Security에 대해 정리해보고자 한다. Spring Security란 스프링에서 제공하는 인증, 권한, 보안 등을 제공해주는 강력한 프레임워크이다. 기존에 필자가 Spring으로 인증 및 권한체크를 구현했을땐 HttpSession과 Interceptor를 이용하여 구현한적 있었는데 이렇게 구 현해놓으니까 중복코드가 너무많이 발생하기도하고 유지보수도 힘든적이 있었다. 그래서 어떻게하면 이보다 편리하게 구현할 수 있을까 생각하다 Spring Security를 적용했었다. Spring Security를 어느정도 알고있는 상태에서 사용하면 편하지만 필자처럼 무작정 모르고 도입했다가 멘탈이 나갈(?) 수 있으 니 이번장에서 자세히 알아보자. Security 의존성 추가 org.sprin..
Spring Boot로 개발하다보면 application.properties나 application.yml 파일에 개발자 정의 프로퍼티를 추가하는일이 많다. 하지만 개발자 정의 프로퍼티를 작성할 경우 왼쪽에 노란색 전구모양의 경고가 뜨게되는데 정상작동은 프로퍼티가 많아지면 왠지 소스가 깔끔하지 못하고 지저분(??)해 보일수 있다. 그래서 이번엔 저 경고창을 없애는 방법과 개발자가 정의한 프로퍼티 값들을 관리할 수 있는 방법을 예제코드와 함께 알아보자. application.propeties(.yml) 파일에 개발자 정의 프로퍼티 추가 사용자에게 이미지파일을 응답하기 위한 요청url과 요청을 서버쪽 이미지가 있는 경로에 전달하기 위한 url 2개를 추가했다. metadata.json 파일생성하기 커서를 경..
웹개발을 하다보면 이미지를 화면에 보여주는 일이 엄청나게 많다. 그때 이미지파일이 프로젝트 내부가 아닌 외부경로에 있는 파일을 보여줄 때가 있다. 예를들어 Spring에서 파일업로드를 구현할때 File 객체를 생성해서 최상위 경로를 C드라이브로 잡게되는데 로컬에 있는 파일은 브라우저 보안상 접근이 되지않는다. 다행히 Spring에선 외부경로에 있는 리소스를 접근할 수 있는 방법을 제공해주는데 예제코드와 함께 알아보자. 외부경로 생성 및 이미지추가 사진과같이 C:\resource 디렉토리 하위에 test.JPG 라는 이미지를 추가해두었다. JAVA 설정코드 추가 WebMvcConfigurer 인터페이스를 구현한 뒤 addResourceHandlers() 메서드를 오버라이딩 하고 아래소스를 추가하자. 해당소..
Maven을 이용한 개발환경에서 mvn에 없는 외부 jar파일 (ex.개발자가 직접 만든 jar파일)을 Maven 레파지토리에 추가해줘야 하 는일이 생길 수 있다. 여러가지 구현방법이 있는데 그중 한가지방법과 주의사항에 대해 예제코드와 함께 알아보자. JAVA 프로젝트 생성 + jar파일만들기 TestUtil이라는 클래스를 만들고 true와 false를 리턴하는 메소드를 생성후 빈 폴더를 만든뒤 해당폴더에다가 Jar파일을 생성하 였다. jar파일명은 java-1.0.0.jar로 생성하였는데 이 jar파일명에 대한 설명은 아래에서 설명하고자한다. 외부 jar파일을 저장할 경로 생성 프로젝트 바로 하위경로에 lib라는 폴더를 생성후 com/java/1.0.0 이름의 폴더로 3댑스형식으로 생성후 위에서 생성해..
이번장에는 Spring에서 제공해주는 MessageSource에 대해 알아보자. 웹개발을 하면서 화면단에 alert함수를 이용해 클라이언트에게 특정메세지를 보여줘야 할때가 많다. 이때 java에서 메세지값을 하드코딩으로 넣고 리턴해주는 경우도 있는데 그렇게 하게되면 하나의 메세지내용을 수정할 때 그 메세지가 입력된 모든파일을 다 찾아가면서 바꿔줘야 한다. 이때 이러한 문제를 해결해주기 위해 MessageSource라는걸 제공해주는데 이 MessageSoure의 기능중 하나인 다국어 지원도 해준다. 예제코드를 통해 알아보자. MessageSourceAccessor 설정 MessageSource 인터페이스의 구현체인 ReloadableResourceBundleMessageSource를 사용해 Message ..
저번장에는 jxls로 엑셀다운로드에 대해 다뤄보았는데 이번에는 엑셀업로드에 대해 예제와 함께 알아보자. 내용이 복잡하지 않고 약간의 설정만 추가해주면 된다. jxls 의존성 등록 저번장에 등록해두었던 의존성을 추가하자 (이미 추가되있으면 하지않아도 된다.) org.jxls jxls 2.6.0 org.jxls jxls-poi 1.2.0 org.jxls jxls-reader 2.0.5 엑셀파일 생성 사용자에게 데이터를 입력받을 샘플 엑셀파일을 생성하자. 그리고 만들어둔 샘플 엑셀파일을 아래사진처럼 src/main/resources/template/excel 하위경로에 옮겨두자 xml 파일생성 해당양식에 맞는 xml파일을 생성하고 샘플엑셀파일과 동일한 경로에 옮겨두자. 그리고 각 태그들의 속성이 무엇을 의미하..
Spring으로 웹개발을 하면서 엑셀다운로드를 구현하는일이 자주 발생하게되는데 이때 쉽고 간편한 세팅으로 엑셀다운로드를 할 수있는 jxls에 대해 설명하고자 한다. jxls란 개발자가 미리 엑셀템플릿을 만들고 엑셀(디비에서 조회된)데이터를 템플릿에 바인딩후 그 결과를 엑셀로 받게끔 처리해주는 java 라이브러리 이다. 필자가 기존에 엑셀다운로드를 구현할때 java에서 Row, Sheet를 직접생성해주고 for문을 사용해서 cell에다 직접 데이터를 셋팅해주었는데 jxls는 이런 작업을 하지않아도 약간의 java코드만 작성해주면 쉽게 엑셀다운로드를 구현할 수 있다. jxls 의존성 등록 jxls도 poi기반으로 만들어졌기에 jxls 의존성과, poi 의존성을 추가하자 org.jxls jxls 2.6.0 o..
Bean은 Spring IoC Container에 의해 관리되는 객체로 객체생성 및 의존주입의 제어권을 개발자가 아닌 Container가 가지고 있다 Spring Container의 대표적인 구현체는 BeanFactory와 ApplicationContext 2가지가 있는데 ApplicationContext로 Spring이 관리하는 Bean목록들을 확인해보자. package com.kjh.study; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBoo..
이번에는 Spring 에서 properties파일에 정의된 값들을 JAVA로 가져오는 방법에 대해 얘기해보자. Spring Boot로 애플리케이션 개발을 해보신분들이라면 application.properties / application.yml / 별도로 만든 propeties파일에 디비접속정보 등 각종 설정값들이 저장되있는걸 많이들 보았을거다. 이런 값들을 가져올때는 여러가지 방법이 있는데 3가지를 소개해보고자 한다. 1. application.properties에서 가져오기 2. 사용자 정의 properties파일에서 가져오기 3. 모든 properteis파일에 정의된 값 가져오기 1. application.properties에서 가져오기 application.properties 파일에 test.key..
회사에서 신규 프로젝트 개발환경을 세팅하는 과정에서 디비를 2개이상 연동하는일이 생겨서 구현을 해보았는데 간단하게 어떻게 세팅해야하는지 그 방법에 대해 얘기해보고자 한다. 그리고 @Primary 어노테이션과 @Qualifier 어노테이션에 대해서도 이번장에서 함께 다뤄보겠다. 1. DB 2대 세팅 실제 개발환경을 세팅할때는 DBMS도 다르고 접속정보도 다르겠지만 이번글에서는 테스트용이기 때문에 로컬에 설치된 하나의 MySQL에 2개의 DB를 만들어 테스트 해보겠다. 2. Properties 파일에 디비 접속정보 등록 연동하고자할 DB의 접속정보를 입력한다. 3. DataSource Bean 설정하기 application.properties에 설정된 2대의 DB접속정보를 읽어드릴 DataSource 객체를..
이번글에는 Spring과 Mybatis 연동에 대해 정리해보고자 한다. mybatis 연동은 xml로도 할수있고 java로도 설정할 수 있지만 이번 블로그에서는 java 설정으로 진행한다. 1. mybatis를 사용하기 위해 pom.xml에 mybatis 의존성을 등록하자. org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.3 2. mybatis 설정파일 생성한다. 위사진의 코드에 대해 간략히 설명해보자면 Line 25 mybatis를 사용하게되면 SQL구문을 java파일이 아닌 별도의 XML파일을 만들어 거기다가 작성하게 되는데 그 XML파일의 경로를 읽어드릴 수 있게 경로를 설정한다. Line 28 mybatis에서 select 쿼리를 사용할 때 re..
Spring에서 Bean이란 Spring IoC 컨테이너(Bean Factory)에 의해 관리되는 Java Object를 Bean이라고 하며 Bean 설정소스를 로드하고 생성된 Bean을 제공하며 기본적으로 '싱글톤' 으로 관리한다. 만약 개발자가 new 연산자로 객체를 생성했을때 그 객체는 Spring IoC 컨테이너에 의해 관리되지 않기 때문에 Bean이라고 할 수 없다. Spring Bean을 등록하는방법은 @Bean, @Configurtaion, @Component 3가지 어노테이션을 사용하면 되는데 각 어노테이션은 어느 상황에 사용해야 되는지 살펴보겠다. 1. @Bean 임의의 클래스를 생성하여 @Bean 어노테이션을 붙혀주면 된다 단, 여기서 주의할 점은 해당 어노테이션을 선언한다해도 제대로 ..
아래사진은 이전글의 Test 했던상황인데 에러메세지가 NoSuchBeanDefinitaionException 즉, 해당 Bean을 찾지못했다는 이유이다. 말 그대로 DataSource 인터페이스의 구현체를 찾을수 없다는 내용이었다. application.properties에 DB접속정보도 잘 넣어주었는데 왜 빈이 생성이 안되는지 한참을 찾아보니 이런글을 발견하였다. https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-sql Spring Boot Features Graceful shutdown is supported with all four embedded web server..
1. pom.xml에 mysql driver 의존성 등록 mysql mysql-connector-java 2. application.properties 파일에 DB 접속정보 등록 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/디비이름?serverTimezone=UTC&characterEncoding=UTF-8 spring.datasource.username=아이디 spring.datasource.password=패스워드 3. JUnit으로 Test 하기 Test가 성공적으로 완료되었다. 이 Test를 진행하는 과정에서 한가지 이슈가 발생했는데 applic..