이번에는 AWS EC2 인스턴스를 생성해보자. EC2에 대해 잘 모른다면 아래링크를 참조하자. https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html AWS 콘솔접속 AWS에 로그인하여 콘솔화면 검색창에 EC2를 검색해서 들어간다. AWS 인스턴스 생성 인스턴스 시작버튼을 눌러준다. Amazon Linux 2 AMI를 선택하자. 위화면에서는 건드릴 부분은 없으므로 하단에 '검토 및 시작' 버튼을 선택하자 여기서 봐야될 부분은 '보안그룹' 인데 인바운드 포트 규칙을 설정할 수 있다. '보안 그룹 편집' 버튼을 누르고 들어가면 위사진처럼 나오는데 인바운드 포트 규칙을 작성할 수 있다. 설정하면 위 사진처럼 인바운드 포트 규칙이 추가된 ..
IAM 이란 Identity and Access Management (IAM) 의 약자이며 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스이며 IAM을 사용하여 리소스를 사용하도록 인증 및 권한부여가 된 대상(사용자)을 제어하는걸 의미한다. IAM 사용자를 생성하는 방식은 크게 두가지가 있는데 액세스 키 방식과 암호 방식 두가지가 있다. 액세스 키 방식은 AWS CLI나 SDK로 AWS 외부에서 AWS의 리소스들을 접근할 수 있도록 해주는 것이고 암호 방식은 AWS Management Console에 직접 로그인을 할 수 있도록 해주는 것이다. 이번글에서는 액세스 키 방식으로 IAM 사용자를 생성하는 방식과 AWS S3에 접근할 수 있게끔 Role을 부여하는 방법에 대해 알아보고자 한다..
이번장에는 S3 버킷을 생성하고 버킷내부에 객체를 생성해보자. AWS 콘솔접속 AWS에 로그인하여 콘솔화면 검색창에 S3를 검색해서 들어간다. AWS 버킷 생성하기 화면우측에 있는 버킷 만들기 버튼을 누르자 버킷이름을 입력하고 AWS 리전은 아시아 태평양 (서울)로 지정하자. 버킷이름에 대한 규칙은 여기에서 확인해보도록하자 일단 모든 사용자한테 액세스를 허용하기위해 모든퍼블릭 액세스 차단 체크박스를 해제하고 아래에있는 체크박스에 체크를 해두고 버킷만들기 버튼을 눌러 버킷을 생성하자 버킷내부에 있는 객체들의 버전을 관리하는건데 똑같은 객체가 생성될 경우 버전관리를 할지 말지 결정하는 것이다. 비활성화하면 기존객체를 덮어씌게되고 활성화하면 덮어씌워지지않고 동일한 객체가 여러개 생성이 되며 각 객체를 식별할 ..
Simple Storage Service는 AWS에서 제공하는 서비스중의 하나로 줄여서 S3라고도 부릅니다. S3는 인터넷 스토리지 서비스이며 웹상에서 원하는 데이터를 저장하고 액세스 할 수 있도록 제공합니다. S3는 주로 애플리케이션에서 이미지, 파일 등 정적 리소스들을 저장하고 조회하는데 쓰입니다. S3를 이용하는데에 있어 장점과 네가지 개념을 간단하게 소개합니다. 장점 데이터의 내구성이 뛰어나다. 필요할 때 데이터를 사용할 수 있으며 장애, 오류 등으로 데이터를 보호할 수 있다. 성능이 우수하며 쓰기 및 읽기작업에 용이하다. 퍼블릭 액세스 차단기능을 지원하여 무단 액세스를 방지할 수 있다. 애플리케이션 영역에서 특정 권한을 가진 사용자만이 데이터를 저장 및 액세스 할 수 있다. Buckets 버킷은..
Spring에서 제공하는 HandlerMethodArgumentResolver는 컨트롤러의 메서드에 조건에 맞는 파라미터 및 어노테이션이 정의되있다면 원하는 값을 주입해주는 인터페이스 입니다. 메서드 매개변수에 @RequestBody 어노테이션이 정의되었으면 HandlerMethodArgumentResolver의 구현체인 RequestResponseBodyMethodProcessor가 동작하여 request body에 있는 Json 포맷의 데이터를 Java 객체에 바인딩을 해줍니다. 세션을 이용하여 로그인 기능을 구현하게되면 로그인 시 입력된 값으로 DB에 사용자를 조회후 조회한 값을 세션에저장할 것 이고 사용자의 정보가 필요할 경우 HttpSession을 컨트로러 메서드 매개변수에 주입받아 사용자의 정..
Java에서 메서드를 호출할 때 인자를 넘기는 방법은 Call By Value와 Call By Reference두가지가 있다. Call By Value는 값에 의한 호출이며 메서드로 인자값을 넘길 때 그 값을 복사해서 넘긴다. 이 방식으로 호출하면 호출한 메서드 내부에서 해당 값을 사용할 때 해당값에 데이터가 변경되도 호출한쪽에서 넘긴 값은 변경되지 않는다. Call By Reference는 참조에 의한 호출이며 메서드로 인자값을 넘길 때 해당 객체를 참조하는 주소를 넘겨준다. 이 방식으로 호출하면 호출한 메서드 내부에서 해당 값을 사용할 때 해당값에 데이터가 변경되면호출한쪽에서 넘긴 값도 변경된다. Call By Value main 메서드에서 정수형 데이터 10과 20이 저장된 변수 두개를 swap 메..
JAVA에서 HTTP 통신을 하기위한 대표적인 라이브러리가 HttpUrlConnection이 있는데 이걸로 API를 개발했을때는 소스코드도 굉장히 길어지고 가독성도 좋지않으며 Type Safety하지않아 JSON으로 받은데이터를 GSON으로 일일이 Convert 해줘야했다. 그런와중에 Retrofit이란걸 알게되었는데 Retrofit을 처음봤을때 코드가 간결하고 가독성이 있고 사용하기도 편해서 이번장에서 정리해보려고 한다. JAVA는 11버전으로 한다. 라이브러리 추가 JAVA에서 Retrofit API를 사용하기위해선 총 6가지의 라이브러리가 필요하다. com.squareup.retrofit2 converter-gson 2.5.0 com.google.code.gson gson 2.8.8 org.jetb..
Spring Cloud Aws 의존성이 추가후 애플리케이션을 실행하면 콘솔에 "Failed to connect to service endpoint"라는 예외메시지가 나오는데 원인과 해결방법에 대해 알아보자. Failed to connect to service endpoint 원인파악 해당예외 메세지가 왜 뜨는지 분석해보자 AwsCloudEnvironmentCheckUtils AwsCloudEnvironmentCheckUtils클래스에서 isRunningOnCloudEnvironment 메서드가 호출 된다. EC2MetadataUtils의 getData 메서드를 호출하는데 getData 메서드 내부를 까보면 getItems 메서드가 호출된다. EC2MetadataUtils getItems 메서드를 호출할 ..
이번장에는 Spring Boot와 AWS SDK를 이용하여 AWS S3에 이미지/파일 정적리소스들을 등록, 조회, 삭제하는 내용에 대해 정리해보고자한다. 그전에 AWS S3에 버킷생성 / IAM 사용자를 생성후 S3 액세스 권한을 부여해줘야한다. 해당작업을 시작하기전에 위 두가지가 완료되지 않았다면 아래링크를 통해 먼저준비해두자 S3버킷 및 객체 생성링크부분에서는 퍼블릭 액세스 접근설정만 하면된다. ('객체생성' 전 단계) https://kim-jong-hyun.tistory.com/84 2. AWS - S3 버킷 및 객체 생성 이번장에는 S3 버킷을 생성하고 버킷내부에 객체를 생성해보자. AWS 콘솔접속 AWS에 로그인하여 콘솔화면 검색창에 S3를 검색해서 들어간다. AWS 버킷 생성하기 화면우측에 있..
Spring Boot로 Bean을 생성시 Bean이 생성되지 않고 다음과 비슷 예외메세지가 본 적이 있을 것이다. NoSuchBeanDefinitionException: No qualifying bean of type 'com.kjh.component.StudyComponent' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} StudyComponent 타입의 Bean을 찾지못했다는 메세지인데 왜 이런 메세지가 나오는지 예제코드와 함꼐 확인해보자. ..
GSON이란 JSON포맷으로 되있는 문자열 데이터를 JAVA의 오브젝트로 직렬화 및 역직렬화 해주는 라이브러리이다. 예제코드와 함께 사용법을 알아보자. 라이브러리 다운 JSON https://mvnrepository.com/artifact/org.json/json/20201115 GSON https://mvnrepository.com/artifact/com.google.code.gson/gson/2.8.6 두개의 라이브러리를 다운받고 프로젝트 마우스 우클릭 > Build Path > Configure Build Path > Libraries 탭 > Add External JARs 클릭후 다운받은 jar파일을 추가한다. JAVA Class 생성 public class Student { private Str..
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..
JAVA로 개발하다보면 제일많이 쓰이는 클래스가 String 클래스인것같다. 이번장에서는 String에 대해 알아보자 String이란? String 클래스는 문자열을 다루는 클래스이며 immutable 하다는 특징이 있다. immutable은 한국어로 해석하면 불변이라는 단어인데 String 객체에 값이 초기에 할당되면 그 값은 변경되지 않는다. String 객체 생성방법 String 객체는 생성하기위해 2가지방식이 있다. 리터럴을 이용한 방법과 new연산자를 이용한 방법이 있다. 리터털로 생성하게되면 String 객체는 String Constant Pool이란 공간에 저장이되며 new연산자를 이용해 생성하면 Heap영역에 생성된다. 그리고 각 변수 a1, a2는 Stack 메모리에 올라가며 String..
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..
우연히 어느 개발커뮤니티 사이트에 올라온 글을 보다 VO를 Map으로 변환해야 하는 질문글이 올라왔는데 그 방법이 궁금해서 이참에 Reflection을 이용하여 양방향으로 원하는 타입에 맞게 변환하는 코드를 작성해 보았습니다. VO Map HTML 삽입 미리보기할 수 없는 소스 결과 HTML 삽입 미리보기할 수 없는 소스 List List HTML 삽입 미리보기할 수 없는 소스 결과 HTML 삽입 미리보기할 수 없는 소스 참고로 Map에서 VO로 변환할 때 두번째 인자에 들어가는 Class 타입엔 해당 Class의 기본 생성자가 있어야한다.
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 메서드로 '..
웹 애플리케이션 개발을 하다보면 메일발송을 구현해야 할 때가 있다. 그때 메일발송을 단순 텍스트가 아닌 HTML 템플릿 형태로 전송해야 될 경우가 있는데 예제코드와 함께 알아보자. 라이브러리 추가 org.springframework.boot spring-boot-starter-mail org.springframework.boot spring-boot-starter-thymeleaf thymeleaf 라이브러리와 Spring Boot에서 제공해주는 mail 라이브러리를 pom.xml에 추가하자 application.properties(yml) 파일에 발신자 정보 등록 발신자의 메일정보는 naver로 해두었다. naver 이메일 환경설정 수정 발신자의 메일정보가 naver이니 해당 메일정보로 로그인후 메일함..
이번장에서는 JAVA의 static에 대해 정리해보고자 한다. static(정적)이란 '고정된' 의미를 말하는데 static 키워드는 필드와 메서드에 올 수 있다. 이때 이 필드와 메서드를 클래스변수, 클래스메서드라고 부른다. 그리고 static 키워드를 붙히게 되면 ClassLoader가 class파일을 메모리에 적재할때 static 영역에 생성되기 때문에 인스턴스를 생성하지 않아도 접근할 수 있다. 예제코드1 위 예제코드를 작성함으로 JVM은 다음과 같은 행위를 하게된다 (1) Main.java를 Main.class로 컴파일을 하게된다. (2) Line 8에서 Main이란 이름을 가진 생성자를 찾아 그 생성자를 가진 class를 인스턴스화 하여 Heap영역에 적재한다 (3) 인스턴스화된걸 main 이..
Spring으로 개발을 하면서 Mybatis 프레임워크를 많이들 써봤을 것이다. Mybatis는 JAVA 객체를 SQL과 매핑시켜주는 SQL Mapper이며 현재까지도 많이 쓰이고 있다. Mybatis를 사용하면서 가장 많이보는 에러중 Paramter를 N개이상 넘겼을때 Parameter not found. available parameters are 라는 예외메세지가 출력되는 경우가 발생할 수 있는데 이 메시지는 왜 발생이되며 어떻게 해결해야하는지 알아보자. 환경구성은 Spring Boot와 Mybatis를 연동해서 살펴보았다. Mybatis Sql SELECT 페이징 객체를 파라미터로 넘겨 리스트 10개를 가져오는 SQL이다. 이때 XML에 정의된 #{start}와 #{end}는 파라미터로 넘어온 P..
개발자가 개발한 기능들을 상용에 배포하기전에 개발 및 QA서버에서 테스트를 하고 정상적으로 문제가 없으면 상용에 배포하게된다. 이때 내가 개발한 코드들을 개발, QA, 상용서버에 배포할때 일일이 각 DB접속정보 및 외부데이터 (프로퍼티에 있는값)들을 서버마다 맞게 변경을 해야하는 번거로움이 있는데 Spring에서는 Profile이란걸 제공해주는데 이 Profile만 설정해두면 원하는 데이터를 원하는 환경에 맞게 배포할수 있게 해준다. 예제코드와 함께 알아보자. 환경별 프로퍼티 세팅 환경마다 다른값들은 (ex: DB정보, 파일경로 등) 프로퍼티 파일에 두고 JAVA에서 해당프로퍼티를 불러오게끔 쓰이는데 그중에 'spring.profiles' 라는 속성에 Profile을 각각 local, dev, prod로..
이번장에는 JAVA 8 부터 제공해주는 스트림과 함수형 인터페이스에 대해 알아보자. 스트림 JAVA 8부터 추가되었으며 Collection의 저장요소를 순회하면서 각 요소들에 대한 필터, 연산, 그룹핑 등의 작업을 해주는 기능이며 람다표현식으로도 처리를 할 수 있다. 스트림이 나오기 전에는 Collection객체를 처리할때 코드가 많아지고 가독성이 좋지않았다. 아래 예제코드를 한번보자 스트림 이전코드 스트림 없이 List를 순회하면서 문자열 'A'가 존재하는 요소들만 따로 List로 얻고싶다면 직접 for문을 돌려서 요소들 하나씩 체크하여 또다른 List에 담아주었다. 가독성도 별로이고 코드길이만 괜히 길어질 뿐이다. 이제 이 방식을 스트림의 기능중 '필터'를 이용해서 처리해보도록 하자. 스트림 이후코드..
웹개발을 해본 개발자라면 게시판을 한번이상은 개발해보았을 것이다. 게시판을 개발하면서 각 게시글의 기본적인 데이터 및 게시글의 순번을 화면에 보여주게 되는데 이때 게시글의 순번은 각 게시글을 대표하는 번호인 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를 보여주게 된다. 존재하지않는 리소스에 요청을 한다던가, 인증이 되지않은 유저가 요청을 한다던가, 서버..