<< 학습 목표 >>

1. 롬복(Lombok) 라이브러리를 설치할 수 있다.

2. 프로젝트를 만들 때 롬복(Lombok) 라이브러리를 사용하도록 설정할 수 있다.

3. 커맨드 객체에 롬복(Lombok) 라이브러리를 사용할 수 있다.


아래와 같은 클래스를 자바에서는 클래스라 부르고 MVC 디자인 패턴에서는 M 또는 DTO라 부르는데 Spring Framework 에서는 커맨드 객체(Command Object) 라고 부름

package com.example.demo.chapter02;

import java.util.List;

import org.springframework.web.multipart.MultipartFile;

public class Member {
	String id;
	String pw;
	String nickname;
	List<String> hobby;
	MultipartFile file;
	
	// getter & setter 생략
}

 

이 클래스 또는 DTO 또는 커맨드 객체라 부르는 것을 컨트롤러의 매개변수에 사용해 클라이언트가 보낸 값을 저장하는 용도로 사용했음

package com.example.demo.chapter02;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class TestController05 {
	@PostMapping("/chapter02/files/type4")
	public void getUserProfile(Member member) {
		// ...
		// ...
		// ...
	}
    
    // ...
    // ...
    // ...
}

 

앞으로 클라이언트가 보내는 값을 꺼내는 용도의 클래스를 커맨드 객체라 칭하겠음

DTO는 조금 더 배우면 나옴


DTO와 커맨드 객체를 만들 때 제일 번거로운 부분이 getter, setter 를 추가하는 부분

그 외에도 equals, toString, hashcode 등도 오버라이딩을 해야하는 경우가 있어 DTO와 커맨드 객체를 만들 때 할 일이 더 많아 짐

또한 프로젝트를 개발할 때 DTO와 커맨드 객체가 적게는 수 십개, 많게는 백여개 그 이상으로 늘어남

DTO와 커맨드 객체를 하나 만들 때 해야 할 일도 많은데 수 십개에서 백여개 이상을 만들 때는 더 번거로워짐

이렇게 번거로운 부분을 도와주는 라이브러리가 롬복(Lombok) 라이브러리임

 

롬복(Lombok) 라이브러리는 DTO와 커맨드 객체의 getter, setter, equals, toString, hashcode 등의 메서드를 자동으로 생성해주고 오버라이딩 해줌

 

롬복을 사용하려면 우선 이클립스에 롬복을 설치해야함

롬복을 설치해보자

인터넷에 lombok 으로 검색(1) 후 첫 번째 검색 결과 페이지(2)로 들어가자

만약 첫 번째 검색 결과가 다르다면 직접 들어가자 / https://projectlombok.org/

 

 

다운로드 메뉴(1)로 들어가 다운로드 받자(2)

다운로드 받을 때 아래와 같이 경고창(3) 이 뜰 수 있는데 그대로 다운로드 받으면 됨

 

다운로드 받은 파일을 보면 jar 파일임

우리가 sts 압축을 풀었을 때와 마찬가지로 cmd 창에서 java 명령을 사용해 압축을 풀어야함

cmd 창(1)을 열고 cd 명령으로 다운로드 폴더로 이동(2)한 후 java 명령(3)을 사용해 압축을 풀자

 

롬복의 압축을 풀면 다음과 같이 롬복 설치창(1)이 열림

그리고 롬복을 설치할 개발툴을 찾지 못했다 메세지(2) 가 보일 것

 

[ OK ] 를 누르고 [ Specify location... ] (1) 을 누르고 사용중인 sts 가 설치된 폴더(2)를 선택(3)하면됨

그 후 [ Install / Update ] (4) 버튼을 누르면 사용중인 sts에 롬복이 설치됨

 

설치가 다 됐다면 설치 프로그램을 종료(1) 하고 sts를 다시 실행시키자

이제 sts에서 롬복을 사용해 DTO와 커맨드 객체를 쉽게 만들 수 있음


이제 프로젝트에서 롬복을 사용하려면 pom.xml에 롬복 라이브러리 URL을 추가하고 사용하면 됨

그치만 우리는 프로젝트를 새로 만들자

 

sts 에서 [ Ctrl + N ] 을 누른 후(1) [ spring ] 으로 검색(2) 해 [ Spring Starter Project ] 를 만들자

 

맨 처음 Spring Framework 프로젝트를 만들었을 때 처럼 Type은 Maven (1) 으로 Packaging은 War (2) 로 설정하자

Java Version은 바꾸지 않아도 됨

왜 바꾸지 않아도 되는지는 설명했으므로 혹시 잊어버렸다면 전 글 ( ) 을 참고하자

 

이번에는 프로젝트명과 기본 패키지도 수정하자


이와 같이 lombok 을 사용할 수 있는 Spring Framework 프로젝트를 생성했음

 

이 프로젝트에 com.sutdy.chatper02 패키지를 추가하고 해당 패키지 내 Member 클래스를 추가하자

그 후 아래 코드를 입력하자

package com.study.chapter02;

import lombok.Data;

@Data
public class Member {
	private String id;
	private String pw;
	private String nickname;
	private String[] hobby;
}

 

getter, setter 메서드가 없고 대신 Member 클래스에 @Data 애너테이션이 붙었음

@Data 애너테이션은 롬복 덕분에 사용할 수 있는 애너테이션이며 클래스에 이 애너테이션을 붙이면 해당 클래스가 갖고 있는 멤버 변수에 맞게 getter, setter 를 자동으로 추가해줌

 

getter, setter가 자동으로 추가됐다는건 [ Outline 뷰 ] (3) 를 통해서 볼 수 있음

<< Outline 뷰가 보이지 않는다면 >>

더보기

sts 상단 [ WIndow ] (1) -> [ Show View ] (2) -> [ Other ] (3)

 

outline 검색 (1) -> [ Open ] (2)


 

이 외에도 롬복을 사용하면 더 많은 것들을 할 수 있지만 우리는 여기까지만 보자

728x90
LIST

<< 학습 목표 >>

1. 클라이언트가 보낸 파일을 꺼낼 수 있다.

2. 클라이언트가 보낸 파일들을 꺼낼 수 있다.


지금까지는 클라이언트가 데이터, 정보를 보냈을 때 이를 꺼내는 방법을 알아봤음

이번에는 클라이언트가 파일을 보냈을 때 이를 꺼내는 방법을 알아보자

 

굉장히 간단해서 짧게 끝날 예정임


클라이언트가 보낸 파일을 꺼내기 위해 컨트롤러를 추가하자

 

프로젝트 -> com.example.demo.chapter02 -> TestController05 클래스를 추가하고 아래 코드를 추가하자

package com.example.demo.chapter02;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class TestController05 {

	@PostMapping("/chapter02/file")
	public void getFile(@RequestParam("file") MultipartFile file) {
		
		try {
			String originalFilename = file.getOriginalFilename();
			int lastIndex = originalFilename.lastIndexOf('.');
			
			String extension = originalFilename.substring(lastIndex);
			
			String dir = System.getProperty("user.dir") + "/src/main/resources/static/upload/";
			Path path = Paths.get(dir + UUID.randomUUID() + extension);
			
			file.transferTo(new File(path.toString()));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

<< 코드 설명 >>

(1). 클라이언트가 보낸 파일을 받기 위한 매개변수

  @RequestParam 애너테이션 안에 있는 문자열은 클라이언트가 파일을 보낸 파라미터 이름

  클라이언트가 보낸 파일을 받기 위해서는 매개변수의 데이터 타입이 MultipartFile 이어야함

(2). 클라이언트가 보낸 파일의 이름에서 확장자명을 추출함

(3). 클라이언트가 보낸 파일을 서버에 저장하기 위해 저장 경로 지정

(4). 클라이언트가 보낸 파일을 서버에 저장하기 위해 저장 경로에 파일명 지정

  클라이언트가 보낸 파일을 서버에 저장할 때는 클라이언트가 보낸 파일명 그대로 사용하면 안됨

  사용자들(클라이언트들)이 서버로 파일을 보내므로 같은 이름의 파일들이 있을 수 있음

  같은 이름의 파일을 보낸다면 덮어씌워 저장하므로 이런 부분을 방지하고자 서버에서는 파일 이름이 같지 않게 설정해 저장해야하는데 이때 유용하게 사용할 수 있는 클래스가 UUID 클래스

  UUID 클래스는 자바에서 고유한 값을 생성할 때 사용하는 클래스로 UUID 클래스의 randomUUID 메서드를 사용하면 128 비트의 랜덤한 문자열을 생성함 이를 사용하면 파일 이름이 충돌되지 않게 저장할 수 있음

(5). 클라이언트가 보낸 파일을 갖고 있는 매개변수의 transferTo 메서드를 사용해 서버에 파일을 저장함

 

여기서 한가지 유의해야할 점은 (3) 에서 클라이언트가 보낸 파일을 서버에 저장하기 위해 저장 경로를 지정했는데 실제 개발에서 이는 좋지 못한 코드임

실제 개발에서는 저장 경로를 하드코딩하거나 설정 파일을 활용하는 등 다른 방식으로 지정함

왜 그런지 궁금하다면 아래 블로그 글을 읽어보자

 

Spring Boot에서 파일 저장을 위한 상대경로 getRealPath() 사용 금지

문제의 원인 새로 만드는 개인 프로젝트에서 이미지 파일을 저장하기 위해 프로젝트 내 Resources 폴더를 이용하려고 했다. Resources에 파일을 저장하면 빌드, 배포 시에 저장된 파일이 유실된다는

stir.tistory.com

 

클라이언트가 보낸 파일을 저장할 수 있게 프로젝트 -> src/main/resources -> static -> upload 폴더를 추가하자

 

프로젝트를 실행시킨 후 아래와 같이 file 이름에 파일을 담아 보내보자

파일을 담아 보내는 방법을 모르겠다면 https://codingaja.tistory.com/101 글 참고


전 글 ( https://codingaja.tistory.com/104 ) 에서 @RequestParam 애너테이션을 사용한 방식처럼 매개변수에 반드시 @RequestParam 애너테이션이 붙어있어야하는건 아님


클라이언트가 서버로 파일들을 보냈다면 어떻게 받아야할까?

 

우선 클라이언트가 서버로 파일들을 보내는 방법은 크게 두 가지가 있음

1. 각각의 이름에 파일들을 보내는 방법

2. 하나의 이름에 파일들을 보내는 방법

 

<< 1. 각각의 이름에 파일들을 보내는 방법 >>

클라이언트가 각각의 이름에 파일들을 보낼 때는 아래와 같이 보낼 것

Insert title here



 

클라이언트가 이와 같이 파일들을 보냈다면 서버에서는 이와 같이 매개변수를 통해서 각 파일들을 받으면 됨

 

<< 2. 하나의 이름에 파일들을 보내는 방법 >>

클라이언트가 하나의 이름에 파일들을 보낼 때는 또 다시 여러 방법으로 나뉘는데

1. HTML만을 사용해 하나의 이름에 파일들을 보내는 방법

2. JS를 사용해 하나의 이름에 파일들을 보내는 방법

이 있음

 

우선 << 2-1. HTML만을 사용해 하나의 이름에 파일들을 보내는 방법 >> 일 때 서버에서 파일들을 꺼내는 방법을 알아보자

 

클라이언트가 이와 같이 HTML만을 사용해 하나의 이름에 파일들을 보낼 수 있음

파일들을 보내므로 name을 files 로 바꿨다는 점에 주목하자

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/chapter02/files/type1" method="POST" enctype="multipart/form-data" style="border: 1px solid black">
		<input type="file" multiple="multiple" name="files" ><br>
		
		<input type="submit" value="전송">
	</form>
</body>
</html>

 

클라이언트가 위와 같이 파일들을 names 파라미터에 담아 보낸다먼 서버는 아래와 같이 배열 또는 (List나 ArrayList) 를 사용해서 꺼낼 수 있음

전 글 ( https://codingaja.tistory.com/105 ) 에서 이미 알아본 내용이므로 코드 설명은 생략

 

Postman 으로 테스트 할 때는 아래와 같이 파일들 files 이름에 담아서 보내면 됨


JS와 Jquery 를 사용하면 하나의 이름에 파일 배열을 담아 보낼 수 있음(왼쪽)

그러나 이와 같이 파일을 보내면 서버에서 받을 수 없음

따라서 하나의 이름에 파일들을 담아 보내야함(오른쪽)


마지막으로 클라이언트가 다른 데이터와 파일을 같이 보냈을 경우는 어떻게할까?

 

아래와 같은 페이지 구성을 보자

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/chapter02/files/type4" method="POST" enctype="multipart/form-data" style="border: 1px solid black">
		<label>아이디 : <input type="text" name="id"></label><br>
		<label>비밀번호 : <input type="text" name="pw"></label><br>
		<label>비밀번호 확인 : <input type="text" name="pwchk"></label><br>
		<label>닉네임 : <input type="text" name="nickname"></label><br>
		<label>프로필 이미지 : <input type="file" multiple="multiple" name="file"></label><br>
		
		<input type="submit" value="전송" onclick="upload(event)">
	</form>
</body>
</html>
Insert title here





 

이런 경우 서버에서는 프로필 이미지만 따로 받아도 되고 DTO에서 함께 받아도 됨

 

파일만 따로 받는 경우 이와 같이 파일만 따로 받을 매개변수를선언하면 됨

 

DTO에서 함께 받으려면 DTO에 파일을 받을 수 있게 MultipartFile 타입의 멤버 변수를 선언(1) 하고 컨트롤러의 매개변수는 DTO만 선언해두면 됨

이때 주의할 점은 DTO에 getter, setter 가 반드시 있어야함


여기까지 클라이언트가 보낸 파일, 파일들을 꺼내는 방법을 알아봤음

 

결국 앞에서 배운 [ 클라이언트가 보낸 데이터를 꺼내는 방법 ], [ 클라이언트가 보낸 데이터들을 꺼내는 방법 ] 과 동일하니 전 글 두 개만 잘 정리해두면 어려움 없이 클라이언트가 보낸 다양한 데이터를 꺼낼 수 있을 것

728x90
LIST

<< 학습 목표 >>

1. 클라이언트가 보낸 값들을 꺼낼 수 있다.

2. 클라이언트가 보낸 JSON 데이터를 꺼낼 수 있다.

3. 파라미터를 선택사항으로 설정할 수 있다.

4. 파라미터의 기본값을 설정할 수 있다.


전 글 ( https://codingaja.tistory.com/104 ) 에서는  클라이언트가 보낸 값을 꺼내봤음

이번에는 전 글의 연장선으로 값들을 꺼내는 방법에 대해서 알아보자


뷰(웹 페이지)에 다음과 같이 체크 박스가 있다고 상상해보자

Insert title here

당신의 취미는?


 

사용자가 체크한 값을 서버로 보내면 다음과 같이 서버로 보내짐

=> http://localhost:8080/컨트롤러URL?hobby=book&hobby=game

 

서블릿 컨트롤러에서는 요청 정보(HttpServletRequest) 에 getParameterValues 메서드로 꺼냈는데 Spring Framework는 어떻게 꺼낼 수 있을까?

 

프로젝트 -> com.example.demo.chapter02 -> TestController03 클래스를 추가하고 아래 코드를 추가하자

package com.example.demo.chapter02;

import java.util.Arrays;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class TestController03 {

	@GetMapping("/chapter02/parameters")
	public void paramters(String[] hobby) {
		System.out.println("<< parameters 메서드 호출 >>");
		System.out.println(Arrays.toString(hobby));
	}
	
}

별도의 코드 설명이 필요 없을 정도로 간단함

클라이언트가 hobby 이름에 book, game 두 개의 값을 담아서 보내므로 서버에서는 매개변수의 타입을 배열로 선언하면 됨

 

프로젝트를 재실행 시킨 후 Postman 에서 아래와 같이 파라미터를 보내보자

 

 

자바에서 컬렉션 프레임워크를 배우며 배열 보다 컬렉션 프레임워크를 사용하는게 더 좋다고 배웠음

위와 같이 클라이언트가 hobby들을 보냈을 때 배열이 아닌 List 또는 ArrayList 컬렉션 프레임워크에 hobby들을 담으려면 어떻게 해야할까?

이때는 매개변수에 @RequestParam 애너테이션이 붙어야함


이번에는 다음과 같이 폼에서 회원 정보를 보냈을 때를 상상해보자

Insert title here

회원가입

당신의 취미는?


 

서버에서는 클라이언트가 보낸 회원 정보를 다음과 같이 꺼낼 수 있을 것

( 바로 위에서 사용했던 컨트롤러에 join 메서드를 추가한 것 )

<< 컨트롤러 >>

package com.example.demo.chapter02;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class TestController03 {
	@PostMapping("/chapter02/join")
	public void join(String id, String pw, String nickname, String[] hobby) {
		// ...
		// ...
		// 회원 가입
		// ...
		// ...
	}
	
	@GetMapping("/chapter02/parameters")
	public void paramters(@RequestParam("hobby") List<String> hobby) {
		System.out.println("<< paramters 메서드 호출 >>");
		System.out.println(hobby);
	}
}

<< 코드 설명 >>

위에서 사용자가 입력한 아이디는 id 매개변수에, 비밀번호는 pw 매개변수에, 닉네임은 nickname 매개변수에, 취미는 hobby 매개변수에 저장되 있음

이렇게 해서 회원 정보(데이터들)을 받을 수 있음

그러나 지금처럼 회원 정보가 흩어져있다면 일반적으로는 회원 정보를 하나로 합쳐서 사용함

 

하나로 합치기 위해 아래와 같이 Member 클래스를 선언하자

getter, setter 반드시 필요함 / 코드 길이 상 생략한 것

package com.example.demo.chapter02;

public class Member {
	String id;
	String pw;
	String nickname;
	String[] hobby;
	
	public Member(String id, String pw, String nickname, String[] hobby) {
		super();
		this.id = id;
		this.pw = pw;
		this.nickname = nickname;
		this.hobby = hobby;
	}
	
	// getter & setter 생략
   }

<< 컨트롤러 >>

 

여기서 잠시 클라이언트가 보낸 정보를 하나로 합쳐 주는걸 클래스, 객체 라고 했지만 MVC 디자인 패턴에서는 M(Model)에 해당함

특히, M 에서도 DTO(Data Transfer Object) 라고 부름

왜 DTO인지는 이 불로그의 글들을 따라오면서 공부하다 보면 알게 됨

 

이 DTO를 바로 매개변수 자리에 쓸 수도 있음

 

DTO가 매개변수가 됐을 때는 DTO가 가지고 있는 멤버 변수의 이름과 일치하는 파라미터를 꺼내 멤버 변수에 저장함

 

 

프로젝트를 재실행 시키고 다음과 같이 요청을 보내보자

 

 

이번에도 hobby들을 배열에 담았는데 hobby들을 List 또는 ArrayList 컬렉션 프레임워크에 담으려면 어떻게 해야할까?

이때는 DTO의 매개변수 타입만 List 또는 ArrayList 로 바꿔주면 됨


클라이언트가 파라미터를 보낼 때 JSON으로 보내는 경우도 있음

클라이언트가 보낸 JSON을 받을 때는 매개변수에 @RequestBody 애너테이션을 붙이면 됨

컨트롤러를 위와 같이 수정 한 후 프로젝트를 재시작하자

 

Postman 으로 JSON 데이터를 보내보자

( 보내는 방법을 모른다면 https://codingaja.tistory.com/101 글을 참고하자 )


여기까지 클라이언트가 다양한 형태의 값을 보낼 때 컨트롤러에서 이를 꺼내는 방법을 배웠음

지금까지는 클라이언트가 반드시 값을 보낸다는 가정으로 컨트롤러에서 이를 꺼냈는데 클라이언트가 값을 보내지 않으면 어떻게 될까??

 

프로젝트 -> com.example.demo.chapter02 -> TestController04 클래스를 추가하고 아래 코드를 추가하자

package com.example.demo.chapter02;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class TestController04 {

	@GetMapping("/chapter02/controller01")
	public void controller01(int param1, double param2, char param3, boolean param4, String param5) {
		System.out.println("<< controller01 메서드 호출 >>");
		System.out.println("-- 클라이언트가 파라미터를 보내지 않았을 때 --");
		System.out.println("param1 => " + param1);
		System.out.println("param2 => " + param2);
		System.out.println("param3 => " + param3);
		System.out.println("param4 => " + param4);
		System.out.println("param5 => " + param5);
	}
	
}

프로젝트를 재시작하고 해당 컨트롤러로 접근하는데 파라미터를 아무것도 보내지 않고 접근해보자

 

클라이언트가 보낸 값을 꺼내기 위해 매개변수가 있는 컨트롤러에 파라미터를 보내지 않으면 아래와 같이 IllegalStateException 이 발생함

왜 이와 같은 예외가 발생하는 것일까?

단순히 클라이언트가 파라미터를 전달하지 않아서 예외가 발생하는건 아님

클라이언트가 매개변수가 있는 컨트롤러에 접근할 때 파라미터를 전달하지 않으면 Spring Framework는 컨트롤러의 매개변수 데이터 타입에 상관없이 매개변수에 null 을 저장함

매개변수 param1의 데이터 타입은 int 인데 int는 null 을 저장할 수 없으므로 InllegalStateException 이 발생하는 것

 

예외가 발생했으니 예외 처리를 해야할까? 그래도 되지만 @RequestParam 애너테이션을 사용하면 클라이언트가 파라미터를 반드시 보내도록 설정할 수도 있고 클라이언트가 파라미터를 보내지 않았을 때 해당 매개변수에 저장될 기본값을 설정할 수도 있음

 

먼저 @RequestParam 애너테이션을 사용해 클라이언트가 파라미터를 반드시 보내도록 설정하자

package com.example.demo.chapter02;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class TestController04 {

	@GetMapping("/chapter02/controller01")
	public void controller01(@RequestParam(name="param1", required=true) int param1,
			@RequestParam(name="param2", required=true) double param2,
			@RequestParam(name="param3", required=true) char param3,
			@RequestParam(name="param4", required=true) boolean param4,
			@RequestParam(name="param5", required=true) String param5) {
		System.out.println("<< controller01 메서드 호출 >>");
		System.out.println("-- 클라이언트가 파라미터를 보내지 않았을 때 --");
		System.out.println("param1 => " + param1);
		System.out.println("param2 => " + param2);
		System.out.println("param3 => " + param3);
		System.out.println("param4 => " + param4);
		System.out.println("param5 => " + param5);
	}
	
}

<< 코드 설명 >>

각 매개변수에 @RequestParam 애너테이션을 달고 이 애너테이션에 required 속성을 사용해 클라이언트가 파라미터를 반드시 보내도록 설정할 수 있음

 

전 글에서도 @RequestParam 애너테이션을 사용해봤지만 전 글에서 사용 방법과 달라졌음

(왼쪽) 전 글과 같이 @RequestParam 애너테이션에 속성명 없이 문자열을 넣으면 이름이 "name" 인 파라미터의 값을 꺼내 해당 매개변수에 저장하도록 하는 것

(오른쪽) 이번 글과 같이 @RequestParam 애너테이션에 name 속성에 문자열을 지정하면 이름이 "param1" 파라미터의 값을 꺼내 해당 매개변수에 저장하도록 할 수 있음

required 속성을 사용하면 클라이언트가 해당 파라미터는 반드시 전달해야하는지 아니면 보내고 싶을 때만 보내는 선택사항인지를 지정할 수 있음

requried 속성이 true면 클라이언트가 해당 파라미터를 반드시 전달해야하고 required 속성이 false면 해당 파라미터는 보내고 싶을 때 보내는 선택사항이 되도록 할 수 있음

 

이제 프로젝트를 재시작한 후 이 컨트롤러에 접근할 때 파라미터를 넣지 않고 접근해보자

반드시 보내야하는 파라미터로 설정했는데 보내지 않았으므로 MissingServletRequestParameterException 이 발생함

이때는 적절한 방법을 사용해 예외처리를 하면 됨

 

클라이언트가 파라미터를 보내고 싶을 때 보내는 선택사항으로 만들어보자

@RequestParam 애너테이션을 붙이지 않으면 해당 파라미터는 선택사항으로 됨

이 애너테이션을 붙여야한다면 다음과 같이 required 속성을 false 로 설정하면 됨

package com.example.demo.chapter02;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class TestController04 {
	@GetMapping("/chapter02/controller02")
	public void controller02(@RequestParam(name="param1", required=false) int param1,
			@RequestParam(name="param2", required=false) double param2,
			@RequestParam(name="param3", required=false) char param3,
			@RequestParam(name="param4", required=false) boolean param4,
			@RequestParam(name="param5", required=false) String param5) {
		System.out.println("<< controller02 메서드 호출 >>");
		System.out.println("-- 클라이언트가 파라미터를 보내지 않았을 때 --");
		System.out.println("param1 => " + param1);
		System.out.println("param2 => " + param2);
		System.out.println("param3 => " + param3);
		System.out.println("param4 => " + param4);
		System.out.println("param5 => " + param5);
	}
	
	@GetMapping("/chapter02/controller01")
	public void controller01(@RequestParam(name="param1", required=true) int param1,
			@RequestParam(name="param2", required=true) double param2,
			@RequestParam(name="param3", required=true) char param3,
			@RequestParam(name="param4", required=true) boolean param4,
			@RequestParam(name="param5", required=true) String param5) {
		System.out.println("<< controller01 메서드 호출 >>");
		System.out.println("-- 클라이언트가 파라미터를 보내지 않았을 때 --");
		System.out.println("param1 => " + param1);
		System.out.println("param2 => " + param2);
		System.out.println("param3 => " + param3);
		System.out.println("param4 => " + param4);
		System.out.println("param5 => " + param5);
	}
}

위와 같이 controller02 컨트롤러를 추가한 후 프로젝트를 재시작하고 해당 컨트롤러에 접근할 때 파라미터를 보내지 말아보자

예외 명은 다르지만 또 다시 예외가 발생함

왜이럴까? 왜 그런지는 위에서 이미 언급했음

 

클라이언트가 매개변수가 있는 컨트롤러에 접근할 때 파라미터를 전달하지 않으면 Spring Framework는 컨트롤러의 매개변수 데이터 타입에 상관없이 매개변수에 null 을 저장함

매개변수 param1의 데이터 타입은 int 인데 int는 null 을 저장할 수 없으므로 InllegalStateException 이 발생하는 것

 

결국은 required=true 일 때도 required=false 일 때도 클라이언트가 파라미터를 보내지 않으면 예외가 발생함

required=false 일 때 예외가 발생하지 않으려면 해당 매개변수에 기본값을 지정하면 됨

기본값은 defaultValue 속성으로 지정할 수 있음

 

다음과 같이 defaultValue 속성을 사용해 controller02 컨트롤러에 매개변수의 기본값을 설정하자

 

이제 클라이언트가 파라미터를 전달하지 않으면 해당 매개변수에는 설정된 기본값이 저장됨

이렇게 파라미터를 선택사항으로 지정하고 싶다면 required 속성은 false로 defaultValue 속성은 파라미터를 전달하지 않았을 때 저장될 기본값으로 지정해주면 됨

728x90
LIST

<< 학습 목표 >>

1. 클라이언트가 보낸 값을 꺼낼 수 있다.

2. 클라이언트가 보낸 값을 형변환해 꺼낼 수 있다.

3. 클라이언트가 보낸 한글 데이터를 꺼낼 수 있다.


이번에는 C의 역할 중 클라이언트가 파라미터를 보냈을 때 파라미터를 꺼내보자

- 클라이언트의 요청을 받음

- 클라이언트가 파라미터를 보냈다면 파라미터를 꺼냄

  꺼낸 파라미터의 형태가 올바른지 확인함

  꺼낸 파라미터들을 하나의 정보로 합칠 수 있다면 합침

- 클라이언트의 요청을 처리할 서비스 메서드를 호출함

- 서비스 메서드가 반환한 처리 결과를 사용해 적절한 후처리를 함

- 클라이언트의 요청 처리 결과를 전달함

 

그 중에서도 특히 클라이언트가 값을 보냈을 때 값을 꺼내는 방법에 대해 알아보자


 

클라이언트가 보내는 파라미터를 꺼내는 방법은 다양한 방법이 있음

1. 요청 정보(HttpServletRequest) 를 사용해 꺼내는 방법

2. @RequestParam 애너테이션을 사용해 꺼내는 방법

3. 매개변수를 사용해 꺼내는 방법

 

세 방법 모두 간단하므로 한꺼번에 코드로 입력한 후 하나씩 알아보자

프로젝트 -> com.example.demo.chapter02 -> TestController02 클래스를 추가하고 아래 코드를 추가하자

package com.example.demo.chapter02;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import jakarta.servlet.http.HttpServletRequest;

@Controller
public class TestController02 {
	@GetMapping("/chapter02/type1")
	public void type1(HttpServletRequest request) {
		String name = request.getParameter("name");
		
		System.out.println("<< type1 메서드 호출 >>");
		System.out.println("클라이언트가 보낸 name 파라미터의 값 => " + name);
	}
	
	@GetMapping("/chapter02/type2")
	public void type2(@RequestParam("name") String name) {
		System.out.println("<< type2 메서드 호출 >>");
		System.out.println("클라이언트가 보낸 name 파라미터의 값 => " + name);
	}
	
	@GetMapping("/chapter02/type3")
	public void type3(String name) {
		System.out.println("<< type3 메서드 호출 >>");
		System.out.println("클라이언트가 보낸 name 파라미터의 값 => " + name);
	}
}

<< 코드 설명 >>

type1 메서드에서 type2, type3 메서드로 내려갈수록 파라미터를 꺼내는 방법이 간단해지고 있음

(1). 서블릿 컨트롤러와 동일한 방식으로 요청 정보(HttpServletRequest) 의 getParameter 메서드를 사용해 꺼냄

(2). @RequestParam 애너테이션을 사용해 name 파라미터의 값을 꺼내 name 매개변수에 저장함

(3). @RequestParam 애너테이션이 없으면 매개변수의 이름과 동일한 파라미터의 값을 꺼내 매개변수에 저장함

 

프로젝트를 실행시키고 각 경로에 name 파라미터를 보내보자

<< Postman 으로 요청 보내는 방법 >>

 

(1) 의 경우 서블릿 컨트롤러의 방식을 그대로 사용한 것이므로 더 설명할 게 없지만 (2), (3) 의 경우 Spring Framework 만의 방식이므로 몇 가지 상황을 더 알아보자

 

클라이언트가 파라미터를 여러 개 보냈다면(1) 다음과 같이 매개변수를 더 추가해 각 값을 꺼내 매개변수에 저장(2)할 수 있음

 

<< Postman >>

 

<< TestController02 컨트롤러 >>

 

여기서 type2의 경우 @ReuqestParam 애너테이션에 값을 꺼낼 파라미터의 이름을 지정했으므로 매개변수의 이름이 중요하지 않음

<< 코드 설명 >>

(1). 클라이언트가 보낸 name 파라미터의 값을 꺼내 param1 매개변수에 저장

(2). 클라이언트가 보낸 age 파라미터의 값을 꺼내 param2 매개변수에 저장

(3). 클라이언트가 보낸 height 파라미터의 값을 꺼내 param3 매개변수에 저장

 

그러나 type3의 경우 값을 꺼낼 파라미터의 이름과 매개변수의 이름이 반드시 같아야함

<< 코드 설명 >>

(1). 클라이언트가 보낸 name 파라미터의 값을 꺼내 name 매개변수에 저장

  클라이언트가 보낸 age 파라미터의 값을 꺼내 age 매개변수에 저장

  클라이언트가 보낸 height 파라미터의 값을 꺼내 height 매개변수에 저장

 

일반적으로는 가장 간단한 type3의 방식대로 파라미터를 꺼냄


Spring Framework 프로젝트이므로 파라미터를 꺼낼 때 당연히 Spring Framework의 방식대로 꺼내지만 특히나 Spring Framework의 방식을 사용해 파라미터를 꺼낼 때 편리한 점은 파라미터의 형변환을 알아서 해준다는 점

위와 같이 클라이언트가 파라미터를 보냈다면 보통 컨트롤러에서는 데이터를 꺼내 형변환 후 사용함

그러나 Spring Framework의 방식대로 꺼낼 때는 매개변수의 타입에 맞게 형변환 되 해당 매개변수에 저장됨

 

프로젝트를 재실행 시킨 후 각 경로로 데이터들을 보내보자

 

앞으로는 특별한 경우가 아니라면 type3 방식대로 파라미터를 꺼낼 것이므로 type2가 빠져있어도 동일하게 적용된다고 생각하자


클라이언트가 한글 데이터를 파라미터에 담아 보냈을 때는 어떻게 될까?

 

컨트롤러에서는 별도로 처리해줄게 없음

서블릿 컨트롤러에서는 반드시 request.setCharacterEncoding("UTF-8") 을 해줘야했지만 Spring Framework 를 사용한 컨트롤러에서는 해당 설정이 자동으로 적용됨

 

이렇게 서블릿 컨트롤러에 비해서 개발자가 할 일이 줄어드므로 Spring Framework 를 사용한 프로젝트를 만드는 것

 

728x90
LIST

<< 학습 목표 >>

1. GET 방식 요청을 처리할 컨트롤러를 만들 수 있다.

2. POST 방식 요청을 처리할 컨트롤러를 만들 수 있다.


C는 컨트롤러(Controller / 제어자)로 컨트롤러라는 뜻 그대로 요청을 제어하기만 해야하고 요청을 처리하는건 지양해야함

요청을 처리하는 역할은 주로 S(Service)가 담당함

 

C가 해야하는건 다음과 같음

- 클라이언트의 요청을 받음

- 클라이언트가 파라미터를 보냈다면 파라미터를 꺼냄

  꺼낸 파라미터의 형태가 올바른지 확인함

  꺼낸 파라미터들을 하나의 정보로 합칠 수 있다면 합침

- 클라이언트의 요청을 처리할 서비스 메서드를 호출함

- 서비스 메서드가 반환한 처리 결과를 사용해 적절한 후처리를 함

- 클라이언트의 요청 처리 결과를 전달함

 

그러나 반드시 위의 것만 해야하는건 아님

위 항목들은 C가 하길 권장하는 것이니 참고하고 상황에 따라서는 달라질 수 있음


C의 역할 중 컨트롤러를 만들어 클라이언트의 요청을 받을 수 있게 해보자

- 클라이언트의 요청을 받음

- 클라이언트가 파라미터를 보냈다면 파라미터를 꺼냄

  꺼낸 파라미터의 형태가 올바른지 확인함

  꺼낸 파라미터들을 하나의 정보로 합칠 수 있다면 합침

- 클라이언트의 요청을 처리할 서비스 메서드를 호출함

- 서비스 메서드가 반환한 처리 결과를 사용해 적절한 후처리를 함

- 클라이언트의 요청 처리 결과를 전달함

 

프로젝트 -> com.example.demo.chapter02 -> TestController01 클래스를 추가하고 아래 코드를 추가하자

package com.example.demo.chapter02;

import java.time.LocalDateTime;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class TestController01 {
	@GetMapping("/chapter02/test/controller/01")
	public void doGet() {
		System.out.println("TestController01 -> doGet 메서드 호출 " + LocalDateTime.now());
	}
	
	@PostMapping("/chapter02/test/controller/02")
	public void doPost() {
		System.out.println("TestController01 -> doPost 메서드 호출 " + LocalDateTime.now());
	}
}

<< 코드 설명 >>

(1). C는 반드시 @Controller 애너테이션을 갖고 있어야함

  @Controller 애너테이션이 있다고 클라이언트의 요청을 받을 수 있는건 아니고 클라이언트의 요청을 받을 수 있게 준비를 하는 것

(2). C 안에 클라이언트의 요청을 처리할 메서드들을 추가해야 하는데 메서드에 @GetMapping 애너테이션을 붙인다면 해당 메서드는 GET 방식 요청을 처리할 수 있는 메서드가 됨

  경로는 애너테이션 안에 문자열로 지정함

  따라서 doGet 메서드는 클라이언트가 GET 방식으로 http://localhost:8080/chapter02/test/controller/01 로 요청을 보낸다면 그 요청을 처리할 메서드임

(3). @PostMapping 애너테이션을 붙인다면 해당 메서드는 POST 방식 요청을 처리할 수 있는 메서드가 됨

  GetMapping 애너테이션과 마찬가지로 경로는 애너테이션 안에 문자열로 지정함

  따라서 doPost 메서드는 클라이언트가 POST 방식으로 http://localhost:8080/chapter02/test/controller02 로 요청을 보낸다면 그 요청을 처리할 메서드임

 

 

이제 프로젝트를 실행시키고 Postman 으로 요청을 보내보자

 

각 요청 방식과 URL을 지정해 요청을 보내면 요청에 맞는 메서드가 호출되 요청을 받을 수 있음

요청을 받았는 지 여부는 sts 내 [ Console 패널 ] (1) 을 확인해보면 알 수 있음

 

 

서블릿을 배운 후 곧바로 Spring Boot를 공부한다는 전재로 이 글을 쓰고 있기 때문에 서블릿과 비교하기 위해 컨트롤러 내 메서드 이름을 doGet, doPost 로 했지만 컨트롤러 내 메서드 이름을 doGet, doPost 로 지정할 필요는 없음

컨트롤러 내 메서드 이름, 코드를 다음 (1), (2) 과 같이 바꾸자

 


서블릿의 컨트롤러와 Spring Framework의 컨트롤러를 직접 비교해보자

 

 

차례대로 비교해보자

 

서블릿 컨트롤러에는 @WebServlet 애너테이션이 붙지만 Spring Framework 컨트롤러는 @Controller 애너테이션이 붙음

또한 서블릿 컨트롤러에는 컨트롤러의 URL을 지정하지만 Spring Framework 컨트롤러는 컨트롤러의 URL을 지정하지 않음

 

 

서블릿 컨트롤러의 경우 해당 경로(1) 로 GET 방식 요청이 들어왔을 때 호출될 메서드(2)이지만 Spring Framework 컨트롤러의 경우 해당 경로(3) 로 GET 방식 요청(4)이 들어왔을 때 호출될 메서드(5)임

 

서블릿 컨트롤러의 경우 컨트롤러 하나당 URL 하나만 처리할 수 있음

그리고 doGet 메서드를 오버라이딩하면 해당 URL의 GET 방식 요청을 처리할 수 있고 doPost 메서드를 오버라이딩 하면 해당 URL의 POST 방식 요청을 처리할 수 있음

둘 다 오버라이딩 한다면 해당 URL의 GET, POST 방식 요청 모두 처리할 수 있음

 

Spring Framework 컨트롤러의 경우 따로 오버라이딩 해야될 메서드는 없고 메서드 위에 애너테이션과 경로를 지정해 해당 URL의 GET, POST 방식 요청을 처리할 수 있음

 

 

서블릿 컨트롤러는 경로(URL) 마다 컨트롤러를 생성해야함

예를 들어 서블릿 컨트롤러로 /chapter02/test/controller/01 경로의 GET 방식 요청 처리, /chapter02/test/controller/02 경로의 GET 방식 요청을 처리하기 위해서는 경로별 컨트롤러가 하나씩, 총 두 개의 컨트롤러가 필요함

 

Spring Framework 컨트롤러는 경로(URL) 마다 메서드를 추가해야함

예를 들어 Spring Framework 컨트롤러로 /chapter02/test/controller/01 경로의 GET 방식 요청 처리, /chapter02/test/controller/02 경로의 GET 방식 요청을 처리하기 위해서는 경로별 메서드가 하나씩, 총 두 개의 메서드가 필요함

 

Spring Framework의 컨트롤러 만드는 방법이 더 간편하다는걸 알 수 있음

728x90
LIST

<< 학습 목표 >>

1. MVC 디자인 패턴에 대해서 설명할 수 있다.


웹 프로그램은 주로 MVC 디자인 패턴을 적용해 개발함

요즘은 Servlet/JSP 를 배우는 단계에서 MVC 디자인 패턴에 대해서 배우므로 알고 있겠지만 혹시 모를 분들을 위해 설명하자면

 

MVC 디자인 패턴

 -> M : Model

 -> V : View

 -> C : Controller

의 약자임


프로젝트를 개발할 때 소스 파일을 굉장히 많이 만들게 됨

또한 소스 파일 내 소스 코드가 굉장히 길고 다양한 코드들이 한 곳에 섞이는데 많은 소스파일을 또 소스 파일 내 많고 다양한 코드를 구분하지 않는 다면 프로젝트 내 코드를 수정해야할 때 굉장히 어려워짐

 

예를 들어 옷가게에서 옷을 진열 할 때 옷의 종류나 용도, 계절에 상관 없이 마구 잡이로 진열해 둔다면 손님, 점원이 어떤 옷을 찾기가 굉장히 힘들 것

그래서 옷의 종류나 용도, 계절에 맞게 진열해둬 손님도 점원도 옷을 찾기 수월하게 함

 

마찬가지로 소스 코드도 역할별로 분리를 하지 않고 한 곳에 모아두면 개발자가 소스 코드를 보기에, 수정하기에 굉장히 힘듬

이를 위해서 "소스 파일 내 소스 코드를 역할별로 분리를 해두자" 가 MVC 디자인 패턴임

자바는 소스 파일이 곧 클래스이므로 "클래스 내 소스 코드를 역할별로 분리를 해두자" 가 됨

 

M은 DB와 관련된 코드를 갖고 있는 클래스를 지칭하는 용어

  M의 또 다른 말로는 DTO와 DAO가 있음

  DTO와 DAO는 M을 더 세세하게 분류한 것임

  DTO는 보통 테이블이 갖고 있는 칼럼을 멤버 변수로 갖고 있는 클래스를 뜻함

  DAO는 테이블에 INSERT, UPDATE, SELECT, DELETE 등의 쿼리를 보내는 클래스를 뜻함

 

V는 사용자가 보는 웹 페이지를 지칭하는 용어

  HTML, JSP 등이 V임

 

C는 클라이언트의 요청을 받을 수 있는 클래스를 지칭하는 용어

 

여기에 S도 있는데 S는 상황에 따라서 없을 수도 있기 때문에 용어에서 빼고 얘기함

S는 Service 로 클라이언트의 요청을 처리할 코드를 갖고 있는 클래스를 지칭하는 용어


예를 들어 우리가 다음과 같은 로그인 페이지를 만들었다고 하자

 

이 로그인 페이지가 사용자에게 보이는 웹 페이지이므로 V 라고 부름

 

M과 C는 눈에 보이지 않으므로 흐름도로 나타내보자

 

로그인 페이지에서 아이디, 비밀번호를 입력하고 [ 로그인 ] 버튼을 누르면 서버로 로그인 요청을 보내는데 이 요청을 C가 받음

요청을 받은 C는 파라미터가 있다면 파라미터를 꺼내고 /필요한 파라미터를 보냈는지, 보냈다면 올바른 형태로 보냈는지 등을 확인/ 함

그 다음 C는 로그인 요청을 처리하기 위해 DAO를 생성하고 DAO를 통해 DB로 쿼리를 보냄

DB는 쿼리 실행 결과를 DAO로 전달하고 쿼리 실행 결과를 받은 DAO는 결과를 가공해야한다면 결과를 가공한 후 결과를 반환함

로그인 처리 결과를 반환 받은 C는 처리 결과에 따라 적절한 후처리를 함

로그인의 후처리라고 한다면 로그인에 성공했을 경우 세션에 로그인 정보를 저장하는게 됨

이렇게 적절한 후처리 후에 요청했던 클라이언트에게 로그인 요청 결과를 전달함

 

이 과정에서 C가 DAO를 직접 호출하지 않고 S(Service)를 호출한 후 S에서 DAO를 호출하는 경우도 있음

또 C, S, DAO에서 DTO를 사용해 필요한 데이터를 주고 받을 수도 있음

 

말로만 들으면 어렵지만 Servlet, JSP 를 배우고 난 후 프로젝트를 했을 때 이미 MVC를 적용한 프로젝트를 진행했을 것임

또한 우리가 앞으로 이러한 구조로 실습을 할 것이기 때문에 혹시 처음 듣는다고해도 걱정할 필요는 없음

 

728x90
LIST

<< 학습 목표 >>

1. Postman 프로그램을 사용해 GET 방식 요청을 보낼 수 있다.

2. Postman 프로그램을 사용해 POST  방식 요청을 보낼 수 있다.

3. Postman 프로그램을 사용해 요청 시 파라미터를 담아 보낼 수 있다.

4. Postman 프로그램을 사용해 요청 시 파일을 보낼 수 있다.

5. Postman 프로그램을 사용해 요청 시 JSON을 보낼 수 있다.


개발 경험이 부족했을 때 항상 했던 고민이 "백엔드를 개발해도 테스트를 어떻게하지?" 였음

백엔드 프로그램을 아무리 완벽히 개발했다고 생각해도 항상 문제가 있기 마련이므로 백엔드 프로그램을 테스트하려면 최소한의 화면 구성은 필요했음

 

졸업 작품을 만들 때 이것 때문에 엄청 고생했음

안드로이드 앱과 아두이노를 활용해 임베디드 시스템을 구성했는데 앱은 최소한의 화면을 구성하는데도 시간이 오래 걸리고 빌드 하는 시간도 상당히 오래 걸려 화면을 조금만 수정하더라도 다시 한참을 기다려야 백엔드 테스트를 할 수 있었음

 

그러다 취업을 했는데 하필... 첫 직장의 업무 강도가 말도 안되게 높아서 사수가 없었음...

빨리 경험을 쌓자는 생각으로 아무대나 취업을 했는데 너무 아무대나 를 간 것...ㅠㅠ

 

그렇게 첫 직장에서도 고생을 하고 있다 프론트엔드 파트 팀장님이 "뫄뫄 씨 화면 없어도 Postman 으로 테스트하면 되" 라고 한 것

그때 그 말을 듣고 Postman 을 사용해봤는데 그때 이후로 백엔드 개발에 속도를 엄~청 낼 수 있었음 !

 

Spring Boot로 만든 Spring Framework 프로젝트를 공부할 때도 뷰가 없으니 뷰 대신 Postman을 사용하면 공부에 속도가 확확 붙을 것~!


Postman은 서버로 요청을 보내는 프로그램인데 GET, POST 방식을 선택해서 보낼 수 있을 뿐만 아니라 파라미터를 담아서 보낼 수도 있고 파일도 보낼 수 있는 백엔드 테스트에 최적화된 프로그램!!

예전에는 사용 방법이 간단해서 별도의 설명이 필요 없을 정도 였지만 지금은 살짝 더 기능들이 추가되 설명이 좀 필요할 것 같아 설명을 하려함

 

우선 Postman부터 설치하자

인터넷에 postman 으로 검색(1) -> 첫 번째 검색 결과(2)로 들어가자

혹시 첫 번째 검색 결과가 이와 다르다면 직접 들어가자 / https://www.postman.com/

 

Postman 을 다운로드(1) 하자

 

설치 후 postman을 실행하자

내 경우만 그럴 수 있는데 설치 프로그램을 실행시키면 별도의 설치 과정 없이 기다리면 바로 설치가 됨


설치 후 회원가입을 하고 로그인을 한 후 사용해도 되지만 그대로 사용해도 됨

요청을 보낼 때는 [ + 버튼 ] (1) 을 눌러 새로운 요청을 생성 한 후 보내면 됨

+ 버튼을 눌러보자

 

 

(1) 에서 요청 방식을 선택 할 수 있고 (2) 에서 요청을 보낼 URL을 입력할 수 있음

 

 

GET 방식으로 요청을 보낼 때 파라미터를 담아서 보내고 싶다면 [ Params ] (1) 에 이름(2)과 값(3)을 지정해 보낼 수 있음

 

 

POST 방식으로 요청을 보낼 때는 요청 방식 (1) 을 POST 로 바꿔 보내면 됨

POST 방식으로 요청을 보낼 때 파라미터를 담아서 보내고 싶다면 [ Body ] (2) 에서 [ x-www-form-urlencoded ] (3) 를 선택하고 이름(4)과 값(5)을 지정해 보낼 수 있음

 

 

파일을 보내고 싶다면 [ form-data ] (1) 를 선택하고 이름(2)에 마우스를 올려두면 [ 선택 버튼 ] (3)이 나오는데 이때 [ File ] (4) 을 선택하고 값(5)에 보내고 싶은 파일을 선택하면 됨

파일을 보낼 때 주의할 점은 보낼 파일의 이름도 반드시 지정해줘야함

 

 

만약 JSON을 보내고 싶을 때는 [ raw ] (1) 를 선택하고 보낼 데이터 유형 (1) 을 JSON으로 선택한 다음 JSON 데이터를 입력 (3) 하고 보내면 됨


여기까지 Postman 을 사용해서 뷰 없이 백엔드 프로그램(API)를 테스트 하는 방법을 배웠음

아직 우리가 Spring Boot로 만든 Spring Framework 프로젝트에서 컨트롤러를 생성하는 방법을 배우지 않았기 때문에 보내는 방법만 간단하게 알아봤음

 

취업 포트폴리오를 만들 때는 보통 뷰와 백엔드를 함께 담당하므로 필요성을 못느낄 수도 있지만 실무에서는 프론트엔드 따로 백엔드 따로 개발하므로 반드시 필요할 것

728x90
LIST

<< 학습 목표 >>

1. 정적인 요소를 어디에 둬야하는지 말할 수 있다.

2. 뷰를 추가하고 이와 관련된 설정을 할 수있다.

3. 컨트롤러를 추가할 수 있다.


이번 Chapter 를 시작하기 전 프로젝트에 com.example.domo.chapter02 패키지를 추가하자

 

Spring Boot 로 만든 Spring Framework 프로젝트의 경우 기본적으로 뷰(View)를 갖지 않음

Spring Boot 로 만든 Spring Framework 프로젝트는 일반적으로 백엔드 서버로만 활용됨

따라서 뷰가 필요하다면 뷰용 프로젝트를 별도로 생성해야함

우리는 뷰로 Postman을 사용하자

 

여기서 설명 하는 내용은 혹시 Spring Boot 로 만든 Spring Framework 프로젝트에서 뷰가 필요할 때를 위해서 기록해두는 것이므로 Spring Boot 를 공부하려고 오신분은 이 글을 넘어가도 됨


직접 Spring Framework 프로젝트를 생성했을 경우 HTML, CSS, JS, 이미지파일, 동영상파일 등과 같은 정적인 요소를 위해서 별도의 설정을 해야함

Spring Boot로 생성한 Spring Framework 프로젝트의 경우 별도의 설정을 할 필요 없이 정적인 요소를 src/main/resources/static 폴더에 넣어두면 됨

 

src/main/resources/static 폴더 안에 이름이 index.html 인 파일을 추가고 아래 코드를 추가하자

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>static 폴더에 위치한 index.html</h1>
</body>
</html>

 

이번에는 src/main/resources/static 폴더 안에 chapter02 폴더를 추가 한 후 해당 폴더에 이름이 some.html 인 파일을 추가하자

그 후 아래 코드를 입력하자

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>static -> chapter02 -> some.html</h1>
</body>
</html>

 

index.html 파일의 URL은 http://localhost:8080/index.html 이고 some.html 파일의 URL은 http://localhost:8080/chapter02/some.html 임

 

프로젝트를 실행시키고 해당 URL로 접근해보자

 

한가지 특이한 점이 있음

우리는 웹 페이지(HTML)를 static 폴더 안에 뒀는데 URL 경로에서는 static 을 뺐는데 잘 접속됨

이는 우리의 프로젝트가 정적인 요소로 접근하면 자동으로 static 폴더 안에서 찾기 때문임

 

HTML뿐만 아니라 JS, CSS, 이미지 파일 등 정적인 요소는 이 static 폴더 안에 모아두면 됨

 

다음 내용으로 이어가기 전에 한 가지 생각을 해보자면 Servlet, JSP 를 배우면서 웹 페이지를 만들 때 HTML 파일을 만든적은 없을 것

HTML 파일 대신 JSP 파일을 만들었을텐데 JSP 파일을 static 폴더에 두면 될까?

결론부터 말하면 "안된다"

 

static 폴더 안에는 위에 얘기한대로 HTML, JS, CSS, 이미지 파일, 동영상 파일 등 정적인 요소만 와야함

JSP는? 동적인 요소임

혹시 "왜?" 라는 생각이 들면 JSP 공부가 아직 부족한 것

이 글을 끝까지 읽다보면 JSP가 어디에 위치해야하는지 알 수 있음

 

우리는 웹 페이지를 HTML 대신 JSP로 만들것이므로 static 폴더 안에는 JS, CSS, 이미지 파일, 동영상 파일만 올 수 있다고 여기면 됨


Spring Boot로 만든 Spring Framework 프로젝트는 기본적으로 JSP를 사용하기 위한 설정이 되어있지 않음

혹시 왜 그런지 궁금하다면 아래 URL로 들어가 제일 밑에 있는 [ 24.2.4 JSP limitations ] 을 참고하자

중요한 내용은 아니므로 보지 않아도 됨

https://docs.spring.io/spring-boot/docs/1.0.1.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features-jsp-limitations

 

Spring Boot로 만든 Spring Framework 프로젝트에서 JSP를 사용하려면 pom.xml에 JSP 라이브러리를 추가해야함

 

(왼쪽) Maven Repository에서 jstl 검색 후 아래 라이브러리로 들어가자

  ! 라이브러리 이름 주의 하기 !

(오른쪽) 가장 최신 버전인 1.2 버전으로 들어가자

 

이제 JSP 를 담을 폴더를 추가하자

JSP를 저장할 폴더는 별도로 생성해줘야함

(1). 프로젝트 -> src -> main -> webapp 폴더 추가

(2). 프로젝트 -> src -> main -> webapp -> WEB-INF 폴더 추가

(3). 프로젝트 -> src -> main -> webapp -> WEB-INF -> views 폴더 추가

 

JSP는 WEB-INF 폴더 안에 위치해야함

WEB-INF 는 프로젝트에 필요한 중요한 설정 파일을 갖고 있는 용도의 폴더인데 중요한 설정 파일을 갖고 있는 폴더이기 때문에 외부(사용자)에서 절대 접근할 수 없고 프로젝트 내부에서만 접근할 수 있음

웹 페이지도 외부에서 직접 접근할 수 없도록 해야함

그래서 WEB-INF 폴더 안에 두는 것

 

배워나가면서 WEB-INF 폴더 안에 여러 파일이 쌓일 것이므로 구분할 수 있게 views 폴더를 추가한 후 그 안에 JSP ( 웹 페이지 ) 파일을 추가하려고 함

 

이제 views 폴더 안에 index.jsp 파일을 추가하자

또 views 폴더 안에 chapter02 폴더를 추가하고 그 안에 some.jsp 파일을 추가하자

 

<< index.jsp 코드 >>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>views 폴더에 위치한 index.jsp</h1>
</body>
</html>

<< some.jsp 코드 >>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>views -> chapter02 -> some.jsp</h1>
</body>
</html>

 

이제 프로젝트에 웹 페이지(JSP)를 추가했으니 웹 페이지에 접근해야하는데~!

프로젝트에 몇 가지 설정을 더해줘야함

1. ViewResolver 설정

2. 컨트롤러 생성

 

<< ViewResolver 설정 >>

ViewResolver 설정은 src/main/resources -> application.properties (1) 에 설정함

 

뷰리졸버 설명을 하기 전에 컨트롤러 먼저 생성하자

<< 컨트롤러 생성 >>

com.example.demo.chapter02 -> ViewTestController 클래스 추가 후 아래 코드 입력

package com.example.demo.chapter02;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class ViewTestController {
	@RequestMapping(value="/chapter02/jsp1", method = RequestMethod.GET)
	public String jsp1() {
		return "index";
	}
	
	@GetMapping("/chapter02/jsp2")
	public String jsp2() {
		return "chapter02/some";
	}
}

 

<< 코드 설명 >>

(1). @이 붙었으므로 애너테이션으로 Controller 애너테이션은 해당 클래스를 컨트롤러로 만들어줌

  컨트롤러는 클라이언트의 요청을 받아 요청을 처리할 서비스 메서드를 호출함

  그리고 서비스 메서드가 반환한 처리 결과에 따라서 클라이언트에게 적절한 결과를 응답함

(2), (3). RequestMapping, GetMapping 애너테이션은 클라이언트의 요청을 처리할 메서드에 붙는 애너테이션

  @RequestMapping 애너테이션은 value, method 속성을 사용함

  value 속성은 "해당 경로로 요청이 들어왔을 때" 로 해석할 수 있음

  method 속성은 "해당 요청 방식으로 요청이 들어왔을 때" 로 해석할 수 있음

  따라서 value, method 속성을 연결해 해석하면 "http://localhost:8080/chapter02/jsp1 로 GET 방식 요청이 들어왔을 때 jsp1 메서드가 그 요청을 처리하겠다" 임

(3). GetMapping 애너테이션은 속성 없이 ( ) 안에 문자열을 넣었는데 애너테이션 이름이 GetMapping 인 것처럼 "http://localhost:8080/chapter02/jsp2 로 GET 방식 요청이 들어왔을 때 jsp2 메서드가 그 요청을 처리하겠다" 임

 

(2)와 (3)에서 문자열을 반환해주는데 클라이언트에게 전달할 뷰이름으로 컨트롤러에서 문자열을 반환하면 뷰 리졸버가 동작해 반환하는 문자열의 앞에 prefix 를 붙이고 문자열의 뒤에 suffix 를 붙여서 해당하는 뷰를 클라이언트에게 전달함

 

따라서 컨트롤러는 문자열을 반환했지만 뷰리졸버 덕분에 클라이언트는 문자열이 아닌 뷰를 전달 받음


혹시 이대로 했는데 뷰가 안나온다면 무시하고 넘어가자

 

이 글의 처음에서 언급했듯 Spring Boot 로 만든 Spring Framework 프로젝트는 백엔드 용으로만 쓰지 그 안에 웹 페이지, CSS 등 뷰를 위한 것들을 넣지 않음

만약 Spring Boot 를 공부하고 포트폴리오를 만든다면 Spring Boot로 백엔드 프로젝트를 만들고 JSP 에서 배웠던 프로젝트를 만들어 이 프로젝트를 프론트엔드 프로젝트로 사용하면 됨

잘모르겠다면 Spring Boot 공부가 다 끝나면 마지막에 프로젝트를 할테니 그대로 따라오면 알게될 것

728x90
LIST

<< 학습 목표 >>

1. Maven을 사용해 필요한 라이브러리를 추가할 수 있다.


우리가 프로젝트를 생성할 때 선택 했던 [ Maven ] 과 프로젝트 내 생성 되어 있는 파일 중 pom.xml에 대해서 최소한으로만 이해해보자

 

Maven은 빌드툴로 좀 더 쉽게 얘기하면 이 글의 제목처럼 프로젝트 관리 도구임

 

비유를 해보자

음식점에서 음식을 만드는 것도 중요하지만 음식을 만들기 위해 준비하는 과정과 음식을 만들고 손님에게 나가기 전 먹음직스럽게 꾸미는 것도 중요함

프로젝트(서비스)를 개발할 때도 개발도 중요하지만 개발하기 전 필요한 라이브러리들을 추가하고 사람들이 사용할 수 있게 배포하는 것도 중요함

 

음식을 만들기 위해 준비하는 과정 = 개발하기 전 필요한 라이브러리들을 추가

음식이 손님에게 나가기 전 꾸미는 과정 = 사람들이 사용할 수 있게 배포하는 과정

사실 음식을 꾸미는 과정과 배포하는 과정은 적절한 비유는 아니지만 실무자가 이 글을 본다면 알아서 넘겨보실 것이고 취업준비생인분이 이 글을 본다면 "아닌데, 엄연히 다른데"까지 생각하지 못하실테니 그냥 적절히 넘겨 보자 ^^;;;

 

개발하기 전 필요한 라이브러리가 있다면 직접 다운 받아 프로젝트의 lib 폴더에 넣고 build path에 추가해야했을 것

이는 개발자 입장에서 굉장히 번거로운데 특히 Servlet, JSP로 프로젝트 다운 프로젝트를 만들어봤다면 크게 공감할 것

이 번거로운 과정을 많이 생략할 수 있게 해주는 것이 Maven 임

 

프로젝트에 Maven을 적용한다면 필요한 라이브러리의 URL을 찾아서 pom.xml 에 넣어주면 끝!

그 URL 조차 Maven Repository 라는 사이트에 모여있어 찾아 헤맬 필요가 전~혀 없음!


Maven Repository 사이트를 구경도 할겸 시험삼아 pom.xml 에 라이브러리 URL을 하나 넣어보자

Maven Repository 사이트는 인터넷에서 Maven Repository 로 검색(1) 하면 됨

검색 결과의 첫 번째 페이지(2) 로 들어가자

검색 결과가 아래와 다르다면 직접 들어가도 됨 / https://mvnrepository.com/

 

Maven Repository 사이트는 앞으로 자주 방문하게 될테니 즐겨찾기에 등록 해두는 것도 좋음

 

이 사이트에는 개발에 필요한 거의 모든 라이브러리 URL이 있음

 

필요한 라이브러리는 검색을 하면 되는데 이번에는 시험삼아 [ Hikari CP ] 라이브러리를 검색하고 이 라이브러리의 URL을 pom.xml 에 등록하자

라이브러리 URL은 필요하면 등록하고 필요 없으면 삭제하면 되므로 "괜히 라이브러리 URL 잘못 등록해서 프로젝트 이상해지는거 아니야?" 라고 걱정할 필요는 없음

 

Hikari CP 검색(1) / 검색을 하고 나면 검색 결과(2)가 굉장히 많음

여기서 내가 원하는 라이브러리를 찾아서 들어가면 됨(3)

 

 원하는 라이브러리를 찾아 들어갔다면 해당 라이브러리의 버전별로 쭉~ 나열(1)되있음

 

이 버전 중 나에게 맞는 버전을 선택 하면 됨

나에게 맞는 버전이 어떤 버전인지 모르겠다면 Usages 가 가장 높은걸 선택하면 됨

Usages 는 간단하게 해당 버전의 인기도 라고 생각하면 됨

 

우리는 근래에 Usages 가 가장 높은 2.13.x (2) 를 선택하자

상세 페이지로 들어오면 해당 라이브러리의 공식 홈페이지(1)를 확인할 수 있음

또 라이브러리의 URL이 아니라 라이브러리 파일이 필요할 경우 다운로드(2) 받을 수도 있음

마지막으로 라이브러리의 URL도 알 수 있음

 

(3) 안에 텍스트를 클릭하면 라이브러리의 URL이 자동으로 복사됨

이제 복사한 텍스트를 Spring Boot로 만든 Spring Framework 프로젝트 -> pom.xml (1) 에 추가하자

 

pom.xml 파일을 열면 그 안에 태그가 굉장히 많은데 라이브러리의 URL을 추가할 때는 <dependencies> 태그(1)를 찾아 그 안에 복사한 라이브러리의 URL을 넣어주면 됨

여기서 조심해야할 점은 라이브러리 URL을 넣을 태그 명이 dependencies 인것처럼 해당 태그 안에 이미 여러 라이브러리 URL이 적혀있음

 

다른 라이브러리 URL과 겹치지 않게 닫는 dependencies 태그 ( </dependencies> 태그 ) 바로 위에 잘 추가하자

 

URL이 우리가 알고 있는 URL과는 조금 다르지만 우리가 추가한 URL을 통해 Maven이 해당 라이브러리를 내려 받고 프로젝트에서 사용할 수 있게 적용을 시켜줌

이렇게 Maven 빌드툴을 사용하면 라이브러리가 필요할 때 Maven Repository 에서 라이브러리를 검색해 URL만 pom.xml에 넣어주면 끝이므로 개발자의 수고를 많이 덜 수 있음


pom.xml 뿐만 아니라 XML 파일을 이클립스에서 사용할 때 컴파일 오류(빨간 밑 줄)이 그어지는 경우가 있는데 진짜 문제가 생겨서 컴파일 오류가 생길 수 있고 정상적인 XML인데 이클립스가 XML을 잘못 해석해 컴파일 오류가 생긴것 처럼 보일 수 있음

XML 파일 내 다음과 같이 컴파일 오류가 생기면 일단은 무시를 하고 프로그램에서 진짜 문제가 생겼다면 그때 문제가 생기지 않게 XML 파일을 확인해 수정하면 됨

 

여기까지 Maven 빌드툴을 사용해 라이브러리를 추가하는 방법을 배웠음

hikari-cp 라이브러리는 시험삼아 추가했으니 이제 지우자~!

728x90
LIST

<< 학습 목표 >>

1. Spring Boot 로 생성한 프로젝트의 Servlet, Tomcat, Java 버전을 확인할 수 있다.

2. Spring Boot 로 생성한 프로젝트의 자바 버전이 17버전인 이유를 설명할 수 있다.

3. Tomcat의 포트 번호를 바꿀 수 있다.


Spring Boot 를 사용하지 않고 우리가 직접 Spring Framework 프로젝트를 만들었다면 일반 자바 프로젝트를 만들고 이 자바 프로젝트를 Spring Framework 프로젝트로 만들기 위한 라이브러리를 엄청나게 많이 추가해야했을 것임

그러나 우리는 Spring Boot 를 사용해 Spring Framework 프로젝트를 만들었기 때문에 라이브러리를 하나도 추가 하지 않았는데도 Spring Framework 프로젝트가 만들어진 것

 

우리가 Spring Boot로 만든 Spring Framework 프로젝트에 추가되어있는 라이브러리 목록을 확인해보자

프로젝트 내 [ Maven Dependencies ] (1) 를 열어보자

 

갑자기 스크롤이 생기며 jar 로 끝나는 이름들이 엄청나게 많이보일텐데 Spring Boot 를 사용하지 않고 우리가 직접 Spring Framework 프로젝트를 만든다면 여기서 보이는 엄청나게 많은 라이브러리를 하나씩 직접 추가해야했음

 

실제로 Spring Framework 를 배울 때 이러한 라이브러리들을 하나 하나 추가함...

Spring Boot 가 있어서 이렇게 편하게 Spring Framework를 만들 수 있다는 점에 감사할 정도...


Spring Boot 프로젝트를 가만히 살펴 보면 이상한 점이 있음

어딜까??

 

이상한 점은 바로!

 

이 부분이 왜 이상할까??

우리가 Spring Boot 로 프로젝트를 생성했던 시점으로 돌아가보자

 

우리는 분명 자바8 버전을 사용하도록 바꿨음

그런데 생성된 프로젝트의 자바 버전은?? 17버전(1)임

 

우리가 프로젝트를 생성할 때는 자바8 버전으로 지정했는데 실제로 만들어진 프로젝트는 자바17 버전을 사용하고 있음

왜 이런 차이가 생기는걸까??

 

혹시 sts가 잘못 보여주는건 아닐까??

프로젝트를 관리해주는 Maven의 설정 파일(pom.xml)을 열어보자

 

이 pom.xml 을 보면 프로젝트의 자바 버전을 확인할 수 있는데 역시나 자바17버전으로 되어있음

여기에 있는 숫자를 8로 바꾸면 되지 않을까? 싶지만 분명 자바 17버전으로 설정된 이유가 있을 것

 

좀 더 찾아보자

프로젝트 우클릭 (1) -> [ Properties ] (2) 클릭 -> [ Project Facets ] (3) 를 보면 우리 프로젝트의 또다른 설정을 볼 수 있음

 

여기서 Dynamic Web Module (4) 은 우리 서버가 사용하는 Servlet의 버전임

Servlet 버전이 6.0 임

Servlet 으로 공부할 때 배웠듯이 Servlet의 버전에 맞춰서 서버 버전과 자바 버전을 선택해야함

 

일반적으로 현재 Servlet을 공부할 때는 Servlet 4.0 버전을 사용하고 이에 따라 Servlet 4.0 버전은 Tomcat 9 버전을 사용하고 자바는 8버전을 사용함

Servlet 버전에 맞는 Tomcat 서버 버전과 자바 버전 선택 가이드는 Tomcat 공식 문서에서 확인할 수 있음

Tomcat 공식 홈페이지 ( https://tomcat.apache.org/ ) 로 들어가 [ which version ] (1) 항목 내 표(2) 를 보면 나와있음

 

(2)의 표를 보면 Servlet Spec 이 4.0 인 라인을 따라 옆으로 가다 보면 Tomcat 버전이 나와있고 또 옆으로 가다 보면 자바 버전이 나와있음

현재 우리가 Spring Boot 로 만든 Spring Framework 프로젝트의 Servlet 버전은 6.0 이므로 Tomcat 버전은 10 버전을 사용해야하고 자바는 11버전 이상을 사용해야함

 

 

일단 여기까지 확인한 바를 통해 우리가 Spring Boot 로 Spring Framework 프로젝트를 만들 때 자바8 버전을 선택 할 수 없다는 걸 알았음

그러면 Servlet 6.0 버전은 자바 11버전 이상을 사용해야하므로 프로젝트를 만들 때 자바8 버전 대신 자바 11버전을 선택하면 될까?

직접 해보면 알겠지만 이 역시도 자바 11버전이 무시되고 여전히 자바 17버전을 사용하는 프로젝트가 만들어짐

 

 

왜그럴까?

chatGPT가 없었다면 이러한 현상을 이해하기 위해 엄청나게 많은 시간이 걸렸을 것

그러나 우리의 든든한 서포터! chatGPT에게 물어보니 한번에 명쾌한 답을 내줬음

 

우리가 Spring Framework 프로젝트를 만들기 위해 사용한 Spring Boot 3.0.5 버전은 Spring Framework 6.0 버전인 프로젝트를 만들어주는데 Spring Framework 6.0 버전은 자바 17버전 이상이 필요하다는 것!

그래서 우리가 만든 프로젝트가 자바 17버전으로 설정된 것

 

Spring Boot 로 생성한 Spring Framework의 서버 설정과 관련된 자세한 사항을 알고 싶다면 아래 사이트에 가보자

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.core

 

Common Application Properties

 

docs.spring.io


현재 현업에서 가장 많이 사용하는 Servlet 은 4.0 버전일 것

그에 따라 Tomcat 9, Java 8 버전을 사용할텐데...

 

우리가 만든 프로젝트의 Servlet, Tomcat, Java의 버전을 현업에서 사용하는 버전으로 바꿀 순 없을까?

바꿀 순 있지만 그러려면 Spring Boot 3.0.5 버전이 아닌 더 낮은 버전을 사용해 Spring Framework 프로젝트를 만들어야함

 

우리가 공부하는 환경과 현업의 환경이 많이 다르지만 그러려면 수 년 전의 책이나 자료를 찾아야하므로 이대로 진행하자

취업에 성공해 Spring Framework 를 사용한 프로젝트에 투입됐다면 Spring Framework의 버전과 Tomcat, Java의 버전을 잘 확인하고 차이가 난다면 신입 딱지가 붙어있을 때 얼른 상사 또는 사수에게 "저는 공부할 때 Spring Framework는 X 버전, Tomcat은 X 버전, Java는 X 버전을 사용했는데 혹시 제가 주의해야할 부분이 있을까요?" 라고 물어보자

아직은 "신입이니까..." 가 용서될 수도 있을 것ㅎㅎ


이렇게 우리 프로젝트의 Spring Framwork, Tomcat, Java의 버전을 확인해봤음

 

마지막으로 Tomcat의 포트 번호를 바꾸는 방법을 알아보자

Spring Boot 를 배울 때 포트 번호를 바꿔야하는 경우가 빈번하게 생기는 듯함

Tomcat의 포트 번호를 바꾸려면 [ 프로젝트 설정 값이 들어가는 곳 ] (1) 에 포트 번호를 설정하면 됨

 

Tomcat의 포트 번호를 8090 으로 바꿔 보자(2)

저장 ( Ctrl + S ) 한 후 프로젝트를 실행시켜보자

 

프로젝트를 실행시키는 방법은 이번까지만 설명하고 다음부터는 생략함

전 글 ( https://codingaja.tistory.com/97 ) 과는 조금 다르게 간단하게 실행시켜보자

실행 시킬 프로젝트(1) 를 클릭  -> 실행 버튼(2) 클릭

 

이제 [ Console 패널 ] (1) 을 확인해보면 Tomcat의 포트 번호가 8090 으로 바뀐걸 알 수 있음

 

프로젝트를 실행시키는데 포트 번호가 이미 사용 중이라 실행시킬 수 없다면 이와 같이 포트 번호를 바꿔 실행시키면 됨

 

저는 포트 번호를 8080 으로 사용할테니 여러분은 여러분의 환경에 맞게 포트 번호를 설정해 사용하면 됨

 

728x90
LIST