저번장에는 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..
2장에서는 JAVA에서 JSON 데이터로 HTTP 통신을 해보는 시간을 가졌는데 이번에는 직접 JSON 데이터를 다뤄보는 시간을 가져보자 JSON 데이터를 다루기 위한 라이브러리와 HTTP통신하는 예제는 아래링크에 첨부해두었다. https://kim-jong-hyun.tistory.com/29 JSONObject 생성 8 Line에 있는 코드가 외부에서 응답받은 JSON 데이터라 가정해보자. String타입의 JSON포맷데이터이다. 이 값을 JSONObject 생성자 호출시 인자로 전달해주면 JSONObject 객체가 생성되며 get(String key) 메서드로 해당 key에 맞는 value를 꺼내온다. 이때 value엔 어떤타입이 담겨있는지 모르니 해당 값에 맞게 casting을 해주면 된다. JSO..
JAVA에서 List를 만들때 ArrayList나 LinkedList와 같은 List 인터페이스를 구현한 구현체의 객체를 생성할 수 있는데 이번글에는 Arrays.asList()와 List.of() 메소드로도 생성할 수 있습니다. 오늘은 이 2개의 차이에 대해 한번 알아보겠습니다. List 생성하기 Arrays.asList()와 List.of()로 각각 List를 생성하였습니다. Arrays.asList() Arrays.asList()의 리턴값은 java.util.ArrayList이 아닌 Arrays 클래스의 내부클래스 ArrayList입니다. asList() 메서드 시그니처를 확인해보면 가변인자를 받게끔 되있고 4323 Line을 확인해보면 ArraysList(Arrays 내부) 클래스의 구조는 배열로..
Spring Boot로 개발하다보면 application.properties나 application.yml 파일에 개발자 정의 프로퍼티를 추가하는일이 많다. 하지만 개발자 정의 프로퍼티를 작성할 경우 왼쪽에 노란색 전구모양의 경고가 뜨게되는데 정상작동은 프로퍼티가 많아지면 왠지 소스가 깔끔하지 못하고 지저분(??)해 보일수 있다. 그래서 이번엔 저 경고창을 없애는 방법과 개발자가 정의한 프로퍼티 값들을 관리할 수 있는 방법을 예제코드와 함께 알아보자. application.propeties(.yml) 파일에 개발자 정의 프로퍼티 추가 사용자에게 이미지파일을 응답하기 위한 요청url과 요청을 서버쪽 이미지가 있는 경로에 전달하기 위한 url 2개를 추가했다. metadata.json 파일생성하기 커서를 경..
이번장에는 JAVA에서 HTTP 통신으로 외부 API를 호출하여 JSON 데이터를 주고받는법을 알아보자. Spring을 이용한 API 개발을 할때 Jackson 라이브러리가 있어서 JSON 요청데이터 파싱 및 응답을 Spring이 컨버팅 해줘서 편하지만 Spring 환경이 아닌 순수 JAVA에선 어떻게 해야하는지 예제코드와 함께 알아보자. JSON 라이브러리 등록 JSON 데이터를 JAVA에서 다루기위해선 JSON 관련 라이브러리를 등록해야한다. 아래링크에 들어가서 jar파일을 다운받고 Build Path에 추가하자. Spring이라면 maven이나 gradle에 해당 의존성을 추가해주면 된다. https://mvnrepository.com/artifact/org.json/json/20201115 jar..
웹개발을 하다보면 이미지를 화면에 보여주는 일이 엄청나게 많다. 그때 이미지파일이 프로젝트 내부가 아닌 외부경로에 있는 파일을 보여줄 때가 있다. 예를들어 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..
이번장에서는 Mybatis Interceptor에 대해 알아보자. 말그대로 개발자가 XML 파일에 쿼리를 작성하고 서비스에서 DAO (SQL Mapper)를 호출할때 개발자가 작성한 쿼리를 가로챈다. Mybatis Interceptor에서는 개발자가 XML 파일에 작성한 SQL의 메타정보들을 얻을 수 있고 파라미터를 가공해서 쿼리를 실행할 수 있다. 예를들어 DB에 고객정보를 저장한다고 가정해보자. 정책에 따라 다르겠지만 고객의 중요한 정보(이름, 연락처, 계좌번호)같은 경우는 평문으로 저장하지않고 복호화 가능한 암호화 데이터로 저장한다. 그럴려면 서비스에서 파라미터 암호화하는 함수를 호출해야하고 조회할때는 복호화하는 함수를호출해줘야 한다. 근데 만일 하나의 애플리케이션에서 암호화해야할 데이터가 고객정보..
JAVA 첫장을 다루는 시간이다. Spring으로 개발을 해오면서 필드 및 메소드 상단에 Annotaion을 선언함으로써 런타임시 스프링에서 직접 객체를 생성하여 주입해주는데 이는 모두 Reflection에 의해 생성이 된다. Reflection이란 객체를 통해 필드, 메소드, 생성자 정보를 얻을 수 있으며 클래스안에 존재하는 변수의 값도 조작할 수 있고 메소드를 호출할 수 있다. Reflection에 대해 들어보기만 하고 상세히 알아보는 시간이 없었는데 간단한 예제를 통해 알아보자. 클래스 및 필드, 메소드 생성 Reflection 이라는 클래스를 생성하여 필드와 메소드를 생성하였다. 필드 및 메소드에 주입할 어노테이션 생성 필드와 메소드에 값을 주입시키기 위해 어노테이션을 생성하였다. 코드 11라인을..
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..
Thymleaf로 개발할때 Thymeleaf에서 제공해주는 각종 Util class들이 있다. 이 Util class엔 많은기능이 제공되는데 상황에 맞게 필요한걸 쓰자. 일단 어떤것들이 있는지 살펴보자 10개정도 존재하는데 이 10개의 클래스들의 패키지를 확인해보면 Thymeleaf에서 제공해주는걸 알 수 있다. class 이름만 보면 어떤 기능들을 수행하는지 예측이 되지만 Aggregates와 Ids는 이름만 들어서 뭐하는 녀석인진 모르겠다. 궁금하다면 나중에 직접한번 내부소스를 살펴보는것도 좋을것 같다. 이제 저 Util class들을 Thymeleaf에서 어떻게 사용해야되는지 간단한 예제를 통해 알아보도록 하자. 표현식 ${#변수.메서드(파라미터)} 여기서 말하는 변수란 위에 언급되었던 10개의 c..
저번글에는 Thymeleaf 세팅법에 대해 알아보았는데 이번엔 기본문법을 알아보자 HTML text 출력 Thymeleaf의 표현식은 [[${text}]] 이렇게 태그 바깥에서 대괄호를 2겹으로 감싸서도 표현이 가능하다. if / else th:if는 if조건에 해당되었을때 출력이 되고 th:unless은 else에 해당되었을때 출력된다** 여기서 한가지 이상한점이 들 것이다. 보통 조건문을 작성시 else if가 아닌 else를 쓸땐 조건식을 명시하지 않는데 Thymeleaf의 조건식은 else문을 작성해줄때 동일한 if조건식을 명시해줘야 그 if조건에 충족하지 않은 결과(else)가 나오게 된다. html tag 서버에서 tag라는 변수에 저장된 값에 HTML 태그가 있다면 그 태그가 문자열이 아닌 ..
보통 Spring으로 개발을 하게되면 view단을 JSP를 많이 사용되는데 그 외에 thymeleaf, freemarker, mustache, velocity 등 다양한 템플릿을 가져다 쓰는데 이번글에서는 Thymeleaf(타임리프) 를 적용해보는 시간을 갖도록 하자. Thymeleaf는 JSP와는 달리 서버에서 컴파일 되지않고 바로 웹브라우저에서 해석이 되는데 이는 브라우저가 해석을 할 수 있는 마크업 언어로 이뤄져있기 때문이다. 이제 기본환경을 세팅해보자 pom.xml에 의존성 추가 web 의존성과 thymeleaf 의존성을 각각 pom.xml에 추가하자 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-b..
이번에는 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..