학습용 공간

Spring) JAR 파일 만들기 (bootJar) - IntelliJ 환경

1. build.gradle 파일에서 아래 플러그인 있는지 확인 2. build.gradle 파일에서 만들 JAR 파일 관련 설정 3. build.gradle 파일에서 JAR 파일 관련 설정 2 bootJar는 jar 파일을 바로 실행 가능하게 해줄 것인지의 여부 결정 (enable로 설정하면 bootJar가 임베디드 톰캣을 이용해서 스탠드얼론 형식으로 서버를 띄울 수 있도록 형식을 갖추어 jar 파일을 생성해준다. -> vm이 main을 불렀을 때, 톰캣을 띄우고 어플리케이션을 띄워서 실행 가능하게 해주는 포맷으로 jar를 빌드해주는 것이다.) jar는 jar 파일 자체를 만들지 여부를 설정하는 것이다. 4. bootJar로 jar 파일 만들기 아래 사진의 Tasks -> build -> bootJar..

JAVA Spring 2020.09.02 starmk95

Spring Annotation) @GetMapping, @RequsetMapping 차이

두 어노테이션 모두 해당 url 입력에 대해 반응하도록 해주는 어노테이션인데 @GetMapping 어노테이션은 @RequestMapping을 특정한 방식으로 사용한 것이라고 할 수 있다. @GetMapping은 @RequestMapping(method = RequestMethod.GET)과 동일한 기능을 수행한다. 즉, 오른쪽 명령어의 단축어라고 할 수 있다. 풀어말하면 @RequestMapping의 기능으로 해당 url에 대한 요청을 처리하는데, 이를 GET 요청으로 받는다는 것이다. 이를 간단하게 적을 수 있게 @GetMapping이 등장했다. 번외로 @PostMapping, @PutMapping, @DeleteMapping도 있다. (@GetMapping와 같은 원리임) 사용범위에서도 차이가 있는데..

JAVA Spring 2020.08.31 starmk95

JAVA Spring) Web server failed to start. Port 8080 was already in use. 해결 방법

# 발생 이유 위 사진과 같은 에러는 로컬 포트(8080 포트)를 이미 사용하고 있는 프로세스가 있기 때문에 발생한 것이다. 인텔리제이 커뮤니티에디션의 경우에는 스프링을 공식지원하지 않는다고 한다. 그래서 스프링 부트가 돌아가는 방식이 VM 메인이 먼저 돌아가고 그 VM 메인이 스프링부트 어플리케이션을 띄우는 구조를 갖는다고 한다. 이때 스프링 부트를 끄지 않고 VM 메인을 종료시키면 VM 메인만 종료되고 부트는 혼자 계속 돌아간다. 그렇기 때문에 프로그램을 끈 것처럼 보여도 실제 프로세스(스프링 부트)는 로컬 포트를 사용중인 것이 되는 것이다. # 해결방법 로컬 포트 8080을 사용중인 프로세스를 kill 해주면 된다. Windows 기준으로 cmd창을 키고 1. 8080 포트를 사용하고 있는 프로세스..

JAVA Spring 2020.08.31 starmk95

JAVA Spring) ResponseEntity란 무엇인가?

# ResponseEntity - ResponseEntity는 RESTful API에서 return type으로써 사용된다. - 일반적인 MVC의 Controller는 View를 사용하지만, RESTful은 객체를 반환하면 이를 JSON 형식으로 직접 HTTP Body에 넣어준다. (@ResponseBody와 유사한 가능을 한다.) - ResponseEntity는 HTTP의 Header, Body, Status Code를 제어할 수 있다. (ResponseBody보다 세밀한 작업 가능) - ResponseEntity를 return type으로 지정하면 JSON 또는 XML 형식으로 결과를 내준다. - ReponseEntity는 HttpEntity를 상속받음으로써 HTTP Header와 Body를 가질 수..

JAVA Spring 2020.08.31 starmk95

Spring Annotation) @ResponseBody

# @ResponseBody @ResponseBody 어노테이션은 받은 요청에 대한 결과를 View를 통해 내려주지 않고(View Resolver를 거치지 않음) HTTP의 body에 직접 반환해주도록 한다. 위 어노테이션이 없을 경우 요청이 들어오고 이에 해당하는 controller를 찾게 되면, 그 controller에서 작업이 수행되고 view를 반환한다. 그럼 ViewResolver하는 곳에서 그에 맞는 View를 찾아서 내려준다. 그러나 @RespinseBody 어노테이션이 붙은 controller에 맵핑되면 작업 수행 후에 나오는 데이터를 ViewResolver 대신 동작하는 HttpMessageConverter에서 받고 HTTP의 body로 바로 넣어서 내려준다. 반환 값이 문자열인 경우에는..

JAVA Spring 2020.08.31 starmk95

Spring Annotation) @CrossOrigin

# @CrossOrigin @CrossOrigin은 CORS 설정을 위한 어노테이션이다. 메소드, 클래스위에 작성된다. # CORS란? Cross-Origin Resource Sharing의 약자이다. 원래 Same-Origin Policy라는 동일한 도메인으로만 HTTP 요청을 받을 수 있다는 규칙이 있었다. 그러나 이 규칙 때문에 다른 도메인의 API를 활용하는데 문제가 생기고, 한 서버에서 여러 도메인을 처리하는 경우에도 문제가 발생하게 된다. 때문에 이를 극복하기 위한 방법으로JSONP(JSON with Padding)이라는 다른 도메인에서 우회를 통해 서버로 접근하는 방법이 생겨난다. 하지만 이러한 방법은 보안상에 문제가 될 수 있기 때문에 계속 사용되도록 방치할 수 없었다고 한다. 그렇다고 아..

JAVA Spring 2020.08.31 starmk95

JAVA Spring) 프로젝트 생성하기

0. IntelliJ 또는 Eclipse 준비, JAVA 11 버전 준비 1. Spring Boot을 통해서 프로젝트를 생성한다. https://start.spring.io/ 위 사이트로 접속해서 프로젝트에 대한 설정들을 하고 파일을 다운로드한다. 이번 예시에서는 Spring Web과 Thymeleaf 라이브러리를 가져온 프로젝트를 예로 든다. 2. 위 사이트 하단의 GENERATE 버튼을 클릭하면 압축파일이 다운로드되는데, 이 파일의 압축을 풀고, 인텔리제이에서 새 프로젝트로 import project을 통해 압축을 푼 파일 내에 build.gradle 파일을 열어서 프로젝트를 연다. 3. 생성한 프로젝트에서 main 메소드를 실행한다. 그러면 위와 같이 실행된다. 실행결과의 Tomcat 부분의 포트 ..

JAVA Spring 2020.08.10 starmk95
JAVA Spring 2020.09.02 댓글 개 starmk95

Spring) JAR 파일 만들기 (bootJar) - IntelliJ 환경

1. build.gradle 파일에서 아래 플러그인 있는지 확인

2. build.gradle 파일에서 만들 JAR 파일 관련 설정

3. build.gradle 파일에서 JAR 파일 관련 설정 2

bootJar는 jar 파일을 바로 실행 가능하게 해줄 것인지의 여부 결정

(enable로 설정하면 bootJar가 임베디드 톰캣을 이용해서 스탠드얼론 형식으로 서버를 띄울 수 있도록 형식을 갖추어 jar 파일을 생성해준다. -> vm이 main을 불렀을 때, 톰캣을 띄우고 어플리케이션을 띄워서 실행 가능하게 해주는 포맷으로 jar를 빌드해주는 것이다.)

jar는 jar 파일 자체를 만들지 여부를 설정하는 것이다.

4. bootJar로 jar 파일 만들기

아래 사진의 Tasks -> build -> bootJar 를 더블클릭하면 JAR 파일이 생성된다.

하단은 jar 생성 완료(빌드 성공)의 모습

5. 생성된 JAR 파일은 프로젝트 파일의 build 폴더 -> libs 폴더 내에 생성된다.

 

JAVA Spring 2020.08.31 댓글 개 starmk95

Spring Annotation) @GetMapping, @RequsetMapping 차이

두 어노테이션 모두 해당 url 입력에 대해 반응하도록 해주는 어노테이션인데

@GetMapping 어노테이션은 @RequestMapping을 특정한 방식으로 사용한 것이라고 할 수 있다.

@GetMapping은 @RequestMapping(method = RequestMethod.GET)과 동일한 기능을 수행한다.

즉, 오른쪽 명령어의 단축어라고 할 수 있다.

풀어말하면 @RequestMapping의 기능으로 해당 url에 대한 요청을 처리하는데, 이를 GET 요청으로 받는다는 것이다.

이를 간단하게 적을 수 있게 @GetMapping이 등장했다.

 

번외로 @PostMapping, @PutMapping, @DeleteMapping도 있다. (@GetMapping와 같은 원리임)

 

사용범위에서도 차이가 있는데

@Get/Post/Put/DeleteMapping은 메소드 레벨에만 사용할 수 있지만,

@RequestMapping은 클래스 레벨에도 사용할 수 있다.

@RequestParam("/api") // 클래스 레벨에도 사용 가능
public class HelloController {

	// 메소드 레벨에만 사용 가능
    @GetMapping("/hello") // web 어플리케이션에서 hello로 들어오면 밑의 메소드를 호출해줌 (Http의 Get 메소드)
    public String hello(Model model) {
        model.addAttribute("data", "hello!!");
        return "hello"; // templates의 hello.html로 연결해줌
    }
}

 

JAVA Spring 2020.08.31 댓글 개 starmk95

JAVA Spring) Web server failed to start. Port 8080 was already in use. 해결 방법

# 발생 이유

위 사진과 같은 에러는 로컬 포트(8080 포트)를 이미 사용하고 있는 프로세스가 있기 때문에 발생한 것이다.

 

인텔리제이 커뮤니티에디션의 경우에는 스프링을 공식지원하지 않는다고 한다.

그래서 스프링 부트가 돌아가는 방식이

VM 메인이 먼저 돌아가고 그 VM 메인이 스프링부트 어플리케이션을 띄우는 구조를 갖는다고 한다.

이때 스프링 부트를 끄지 않고 VM 메인을 종료시키면 

VM 메인만 종료되고 부트는 혼자 계속 돌아간다.

그렇기 때문에 프로그램을 끈 것처럼 보여도 실제 프로세스(스프링 부트)는 로컬 포트를 사용중인 것이 되는 것이다.

 

# 해결방법

로컬 포트 8080을 사용중인 프로세스를 kill 해주면 된다.

Windows 기준으로 cmd창을 키고

1. 8080 포트를 사용하고 있는 프로세스를 확인한다. (pid를 확인)

cf) pid : process identifier로 프로세스 식별자, 즉 프로세스를 식별하는 고유번호를 의미한다.

아래 명령어를 통해 확인할 수 있다.

netstat -ano | findstr 8080

2. 해당 프로세스를 kill해준다.

1번 명령어로 확인한 8080포트를 사용중인 프로세스의 pid(맨 뒤의 숫자)를 확인하고

아래 명령어를 실행해준다.

taskkill /F /pid pid번호

 

3. 프로세스 kill 성공!

 

# 원인

(인텔리제이 기준)

필자의 경우에는 Spring에서 코드를 수정하고 종료(빨간 네모 버튼)가 아닌 재시작(시계방향의 화살표)를 눌렀는데

이 방법이 부트는 종료하지 않고 VM 메인만을 종료하고 다시 실행하였기 때문에 

위와 같은 에러가 발생했다.(고 추측한다 ㅎ)

 

Spring 종료 시에 빨간 네모 버튼으로 종료를 하고 다시 실행하는 방식으로 재시작을 하면 위와같은 에러는 발생하지 않는다.

JAVA Spring 2020.08.31 댓글 개 starmk95

JAVA Spring) ResponseEntity란 무엇인가?

# ResponseEntity

- ResponseEntity는 RESTful API에서 return type으로써 사용된다.

- 일반적인 MVC의 Controller는 View를 사용하지만, RESTful은 객체를 반환하면 이를 JSON 형식으로 직접 HTTP Body에 넣어준다. (@ResponseBody와 유사한 가능을 한다.)

- ResponseEntity는 HTTP의 Header, Body, Status Code를 제어할 수 있다. (ResponseBody보다 세밀한 작업 가능)

- ResponseEntity를 return type으로 지정하면 JSON 또는 XML 형식으로 결과를 내준다.

- ReponseEntity는 HttpEntity를 상속받음으로써 HTTP Header와 Body를 가질 수 있다.

 

# ResponseEntity 클래스의 정보

docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/ResponseEntity.html

 

ResponseEntity (Spring Framework 5.2.8.RELEASE API)

Extension of HttpEntity that adds a HttpStatus status code. Used in RestTemplate as well @Controller methods. In RestTemplate, this class is returned by getForEntity() and exchange(): ResponseEntity entity = template.getForEntity("https://example.com", Str

docs.spring.io

 

JAVA Spring 2020.08.31 댓글 개 starmk95

Spring Annotation) @ResponseBody

# @ResponseBody

@ResponseBody 어노테이션은 받은 요청에 대한 결과를 View를 통해 내려주지 않고(View Resolver를 거치지 않음) HTTP의 body에 직접 반환해주도록 한다.

 

위 어노테이션이 없을 경우 요청이 들어오고 이에 해당하는 controller를 찾게 되면, 

그 controller에서 작업이 수행되고 view를 반환한다. 그럼 ViewResolver하는 곳에서 그에 맞는 View를 찾아서 내려준다.

 

그러나 @RespinseBody 어노테이션이 붙은 controller에 맵핑되면 작업 수행 후에 나오는 데이터를 ViewResolver 대신 동작하는 HttpMessageConverter에서 받고 HTTP의 body로 바로 넣어서 내려준다. 

반환 값이 문자열인 경우에는 StringHttpMessageConverter가 작동하고

반환 값이 객체인 경우에는 MappingJackson2HttpMessageConverter기 작동한다.

(Jackson : 객체를 JSON으로 바꾸는 라이브러리)

JAVA Spring 2020.08.31 댓글 개 starmk95

Spring Annotation) @CrossOrigin

# @CrossOrigin

@CrossOriginCORS 설정을 위한 어노테이션이다.

메소드, 클래스위에 작성된다.

 

# CORS란?

Cross-Origin Resource Sharing의 약자이다.

원래 Same-Origin Policy라는 동일한 도메인으로만 HTTP 요청을 받을 수 있다는 규칙이 있었다.

그러나 이 규칙 때문에 다른 도메인의 API를 활용하는데 문제가 생기고, 한 서버에서 여러 도메인을 처리하는 경우에도 문제가 발생하게 된다.

때문에 이를 극복하기 위한 방법으로JSONP(JSON with Padding)이라는 다른 도메인에서 우회를 통해 서버로 접근하는 방법이 생겨난다. 하지만 이러한 방법은 보안상에 문제가 될 수 있기 때문에 계속 사용되도록 방치할 수 없었다고 한다.

그렇다고 아예 막아버리기엔 수요가 많았기 때문에 합법적(?)으로 다른 도메인에서도 서버에 접근할 수 있도록 해준 방법이 바로 CORS이다.

즉, CORS는 웹 페이지의 제한된 리소스를 외부 도메인 에서도 접근할 수 있게 허용해주는 메커니즘이다.

 

위의 CORS를 실현하기 위해 Spring에서 사용되는 어노테이션이 바로 @CrossOrigin이다.

JAVA Spring 2020.08.10 댓글 개 starmk95

JAVA Spring) 프로젝트 생성하기

0. IntelliJ 또는 Eclipse 준비, JAVA 11 버전 준비

 

1. Spring Boot을 통해서 프로젝트를 생성한다. 

 

https://start.spring.io/

위 사이트로 접속해서 프로젝트에 대한 설정들을 하고 파일을 다운로드한다.

Spring Initializer 설명

이번 예시에서는 Spring Web과 Thymeleaf 라이브러리를 가져온 프로젝트를 예로 든다.

 

2. 위 사이트 하단의 GENERATE 버튼을 클릭하면 압축파일이 다운로드되는데,

이 파일의 압축을 풀고, 인텔리제이에서 새 프로젝트로

import project을 통해 압축을 푼 파일 내에 build.gradle 파일을 열어서 프로젝트를 연다.

 

3. 생성한 프로젝트에서 main 메소드를 실행한다.

그러면 위와 같이 실행된다.

실행결과의 Tomcat 부분의 포트 8080을 확인하고,

(아파치 톰캣은 아파치 소프트웨어 재단에서 개발한 서블릿 컨테이너만 있는 웹 애플리케이션 서버이다.

톰캣은 웹 서버와 연동하여 실행할 수 있는 자바 환경을 제공하여 자바서버 페이지와 자바 서블릿이 실행할 수 있는 환경을 제공하고 있다. - 위키백과)

http://localhost:8080/

에 접속하면 제대로 프로젝트가 생성되었는지 알 수 있다.

제대로 프로젝트가 생성되었다면

위와 같은 페이지가 생성되었을 것이다.

(프로젝트가 제대로 생성되지 않았다면, 위 주소로 들어가도 접속이 되지 않는다)