6개월의 kdt 개발자 과정을 수료하고,
취업이 되지 않아 취업 준비를 하며 kdt 심화 과정에 참여하게 되었고,
사전에 숙지해야할 강의들을 수강하면서 기록하게 되었다.
1. jdk: LTS(Long Time Support)_장기지원 버전인 JDK17 버전 다운받기
└ .msi 확장자 실행한 후 설치할 때 Location 설정시 Folder name을 C:\Program Files\Java\jdk-17.0.13.11-hotspot\ 으로 지정
2. git
- 명령 프롬프트에서 깃 설정 확인하기: git config --list 혹은 git config -l
- --global 을 사용하여 전역으로 설정하기
# 계정 설정
# --global을 사용하여 전역으로 설정
git config --global user.name "USER_NAME"
git config --global user.email "USER_EMAIL"
# 설정된 계정 삭제
git config --unset --global user.name
git config --unset --global user.email
# 브랜치명 변경하기 master --> main
git config --global init.defaultBranch main
# git 저장소 생성
# 저장소를 만들 폴더로 이동 후 git 저장소를 만든다.
# 현재 디렉토리를 기준으로 저장소가 만들어진다.
git init
3. 인텔리제이 초기 설정
preferences > editor > Auto Import
Insert imports on paste: Always: 인텔리제이에서 파일간 코드를 복사한 후 붙여넣기 했을 때
필요한 라이브러리 import문을 항상 자동으로 삽입하는 것을[추가하는 것을] 활성화시키는 설정이다.
Add unambiguous imports on the fly: 코드를 작성하는 동안 자동으로 명확한 import문을 추가하는 기능
Optimize imports on the fly: 코드를 작성하는 동안 import문을 최적화하는 기능,
즉 사용하지 않는 import문을 정리하고, 필요한 import문을 정돈하는 등의 기능을 의미한다.
4. gradle이란 빌드 자동화 시스템이다.
빌드 자동화 시스템은 개발자가 작성한 소스코드를 실행가능하게 만드는 일련의 과정이다.
gradle을 사용하면 자바파일을 실행가능한 자르파일로(*.jar) 만들어준다.
build.gradle은 gradle기반의 빌드 스크립트다.
build.gradle을 작성하면 소스코드를 빌드하고, 라이브러리간의 의존성을 쉽게 관리할 수 있다.
build.gradle은 groovy 또는 코틀린 언어로 작성할 수 있다.
// build.gradle --> gradle기반의 build 스크립트
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.7'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'com.sparta'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
// 다양한 라이브러리와 버전을 관리하고 있는 메이븐 레파지토리라는 중앙 저장소에서
// 하기 dependencies 에 작성한 라이브러리들을 해당 프로젝트에서 사용될 수 있도록
// gradle이 다운로드한다. 그리고 라이브러리간 충돌을 방지하기 위해 버전관리도 한다.
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
5. 서버란 무엇인가
네트워크(Network): to connect computers in a way that allows information and equipment to be shared
→ 정보를 공유하고, 장비를 공유할 수 있도록 컴퓨터들을 연결하는 방식(방법) → 컴퓨터간 데이터를 송·수신할 수 있게 최소한의 물리적인 장비가 필요하고, 이 물리적인 장비 사용 및 공유를 통해 (컴퓨터간) 정보통신이 이루어진다.
(컴퓨터간) 정보통신이 이루어질 수 있도록 (컴퓨터간) 연결을 위해
하드웨어 역할에 해당하는(일종의 도로) 라우터, 스위치, 허브 등과 같은 물리적 장치가 필요하고,
→ 기기간 정보통신이 이루어질 수 있도록 구성된 도로를 네트워크라고 하는 것 같음
연결된 길을 통해 컴퓨터간 데이터를 정확하고, 보안성 있고, 효율적으로 송·수신하기위해
ip주소, 포트번호 등과 같은 추상적? 설정정보가 필요하다.
네트워크상에서 내 컴퓨터를 식별하기 위한 위치 주소를 ip라고 하고,
이 ip를 기준으로 (컴퓨터간) 데이터 송/수신이 이루어진다.
그리고 내 컴퓨터에서는 여러가지 프로그램이 실행되는데
여러 개의 프로그램중 어떤 프로그램이 데이터를 보내는지 혹은 데이터를 받아야하는지 식별하기 위해 포트번호(port)가 존재한다.
택배를 보낼 때 적는 '수신지'를 ip라고 한다면 해당 주소의 '수신인'은 포트번호라고 할 수 있다.
웹 서버와 웹 클라이언트
웹 서버는 네트워크상에서(인터넷에서) http를 통해 요청받은 클라이언트의 요청에 응답하는 역할을 가진 일종의 컴퓨터다.
└ Hyper Text Transfer Protocol(글자뿐만 아니라 이미지, 영상 등을 전송할 수 있는 형식)
네트워크상에서 웹 클라이언트가 웹 서버에게 글자(이미지, 영상 등)를 요청하기 위해서는 http 규칙에 맞게 요청해야 한다.
API는 application programming interface의 약어로 다른 소프트웨어간 통신하기 위해 따라야 하는 규칙을 정의한다.
RESTful API는 Representational State Transfer(REST)는 API 작동방식에 대한 조건을 부과하는 소프트웨어 아키텍처다.
네트워크상에서 웹 클라이언트가 단순히 데이터를 요청했을 때(GET 방식으로 요청을 받았을 때)
웹 클라이언트가 서버에 데이터를 전송했을 때(POST방식으로 요청을 받았을 때) 등의 요청에 응답하는 방식을
구조화하는 것을(http를 준수하여 프로그래밍) Restful하게 설계했다고 하는 것 같음.
웹상에서 웹 클라이언트가 단순히 데이터를(ex. 파일) 요청했을 때(http의 get방식으로 웹 서버에 요청이 감)
서버에서는 웹 클라이언트가 단순히 데이터를 요청할 때 응답할 데이터를 설계해놓았고
그 설계를 들여다보면 @GetMapping("/api/hello") 도메인주소에? /api/hello가 붙여져서 요청을 받았을 때
어떤 메서드를 호출할지 해당 어노테이션 아래에 기술한다.
// 클래스 레벨에서 @RestController를 명시함
// 웹 클라이언트로부터 요청이 들어왔을 때: 도메인주소/api/hello
// hello() 메서드를 호출한다. 문자열 형식으로 "Hello World"를 반환한다.
@GetMapping("/api/hello")
public String hello() {
return "Hello World";
}
6. 컴퓨터간 데이터를 통신할 때 http 양식을 준수해야함
- 주소창에 url을 작성한 후 엔터를 치는 행위는 서버에 get방식으로 데이터를 요청하는 행위다.
네트워크에서 Header
웹 클라이언트가 서버에 요청을 보낼 때 메타데이터가(부가적인 데이터, 추가 데이터) header에 포함된다.
웹 클라이언트가 서버에 요청한 데이터(자원, 예를들면 파일 같은 것)는 Request URL에 명시되어 있다.
Request Method(요청방식)는 POST, 요청한 자원을 웹 서버로부터 수신했는지의 여부
즉 통신이 이루어졌는지는 Status Code에서 확인이 가능하다.
Status Code(상태코드) 값 200은 성공적인 데이터 통신을 의미한다.
payload는 (실제) 데이터를 의미한다. 서버가 응답을 보낼 때는 항상 payload를 보낼 수 있다.
클라이언트(브라우저)가 요청을 할 때에도 payload를 보낼 수 있다.
그리고 http의 약속에서 GET 메서드(방식)를 제외하고는 모두 payload를 보낼 수 있다.
7. 테스트 코드
버그란 소프트웨어가 예상하지 못한 결과를 내는 것 → 소스코드에 오류가 있다는 것
프로그래밍한대로 결과를 내는지 확인하는 과정을 거쳐야하는데 이 때 사용되는 것이 테스트 코드다.
개발자가 본인이 작성한 프로그램이 의도한대로 작동하는지를 테스트하는 개발자 테스트는
빠르고 정확한 테스트가 가능하고, 테스트의 자동화가 가능하다.
스프링에서는 테스트 코드를 작성할 수 있는 환경을 제공한다. 그 환경을 JUnit이라고 한다.
테스트 클래스에서는 메인 메서드가 없다. JUnit은 테스트 실행환경을 별도로 갖고 있기 때문에
main()를 실행하거나 서버를 따로 실행시키지 않아도 기능별로 작성된 각각의 테스트 메서드를 실행시킬 수 있다.
하나의 메서드 단위로 테스트할 경우 메서드 블록에 작성한 각각의 상황별로 전부 테스트해야 제대로 테스트 하는 것
각각의 상황별로 테스트하기 때문에 테스트 시간이 오래걸리는 단점이 있다.
단위테스트에서 엣지별로 테스트해야 해당 기능을 제대로 테스트하는 것이고,
이렇게 제대로 테스트하기 때문에 테스트 시간이 오래걸리는 단점이 있다.
8. 롬복과 application.properties
자바 프로그래밍 언어를 사용할 때 enable annotation proccessing 설정을 사용할 수 있다.
enable annotation proccessing 설정은 컴파일할 때 애너테이션을 해석하여
추가적인 코드나 파일을 생성할 수 있도록 설정하는 것을 의미한다.
애너테이션을 코드에 작성함으로써 메타데이터를(부가적인 정보) 제공하는 것이다.
예를 들어 @Override와 같은 애너테이션은 해당 클래스가 부모를 상속 및 구현하고 있고,
부모로부터 상속받은 메서드를 재정의한다는 것을 의미한다.
@Getter 애노테이션은 클래스에 작성한 필드의 값을 외부에서 접근할 수 있도록 getter 메서드를 자동으로 만들어준다
외부에서 Memo 객체를 생성하고, 해당 객체의 필드 값에 접근할 때 필드의 접근제어자가 public이라면 .으로 해당 필드의 값을 쉽게 얻을 수 있지만 만약 해당 필드의 접근제어자가 private일 경우 참조변수명.필드명 만으로 접근할 수 없다. 이런 경우에 해당 필드의 값을 얻기 위해 getter 메서드를 통해 접근해야 하는데 이 getter 메서드가 해당 클래스에 작성되어 있어야 한다.
// @Getter 애노테이션은 해당 클래스에 작성된 필드의 값을
// 외부에서 접근할 수 있도록 getter 메서드를 자동을 만들어준다.
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class Memo{
private String username;
private String contents;
// 확장자가 .java인 Memo.java 파일에는 없지만
// 확장자가 .class인 Memo.class 파일을 보면
// 하기와 같은 getter 메서드가 작성되어 있다.
public String getUsername() {
return this.username;
}
public String getContents() {
return this.contents;
}
// @Setter 애노테이션이 하기와 같은 setter 메서드를 생성한다.
public void setUsername(final String username) {
this.username = username;
}
public void setContents(final String contents) {
this.contents = contents;
}
// @NoArgsConstructor 애노테이션 하기와 같이 파라미터가 없는 기본 생성자를 만들어준다.
public Memo() {}
// @AllArgsConstructor 애노테이션은 모든 필드의 값을 파라미터로 받아 인스턴스를 생성하는
// 생성자를 만들어준다.
public Memo(final String username, final String contents){
this.username = username;
this.contents = contents;
}
/*
...
*/
}
클래스 레벨에 @RequiredArgsConstructor 애노테이션을 작성했다면
해당 클래스에 final이 붙은 필드를 갖는 생성자를 만들어준다.
spring과 관련된 설정 정보를 작성하는 파일은 application.properties
application.properties 파일의 위치는
src
┗ main
┗ java
┗ resources
┗ application.properties
┗ test
9. Spring MVC
프로그램을 구성하는 요소들을 모델(Model), 뷰(View), 컨트롤러(Controller) 로 구분하여
각각의 역할이 분리되도록 설계한 구조를 MVC라고 한다. 모델은 데이터와 비즈니스 로직을 담당하고,
데이터베이스 관리 시스템을 연결하고, 데이터를 저장하거나 데이터를 불러오는 작업 등을 수행할 수 있다.
뷰는 사용자의 인터페이스를 담당한다. 사용자가 보는 화면을 구현한다.
컨트롤러는 모델과 뷰 사이에 상호작용을 조절하고 제어할 수 있다.
사용자의 입력을 받아서 모델에 전달하고, 그 결과를 갖고 View를 업데이트할 수 있다.
Spring Web MVC는 Java Servlet API가 제공하는 기능을 바탕으로 클라이언트로부터 http 요청을 받아
웹 서버는 해당 요청 방법에 대한 응답을 클라이언트에게 반환하는 방식으로 웹 어플리케이션을 동작시킨다.
결론적으로 Spring Web MVC는 Java Servlet API의 기능을 사용해 웹 요청을 처리한다고 볼 수 있다.
정식 명칭인 "Spring Web MVC"는 Spring Web MVC의 소스 모듈명(spring-webmvc)에서 탄생했지만
"Spring MVC"로 더 흔하게 알려져 있다.
DispatcherServlet이 중앙에서 http 요청을 처리해주는데 이는 FrontController 패턴으로 설계되어 있다.
서블릿은 자바 언어를 바탕으로 웹 페이지를 동적으로 만들수 있게 구조화된 서버측 프로그램 또는 그 기술?을 말하는 것 같다.
사용자가 http api를 요청했을 때 서버에서 서블릿이 어떻게 동작하고 있는지를 알아보겠다.
1. 사용자가 http 양식으로 어떤 자원을 요청한다: http request
2. 웹 클라이언트로부터 요청이 들어오고, 웹 서버가 처리하지 못하는 요청이면
웹 서버는 웹 어플리케이션 서버에게 요청을 위임한다.
웹 컨테이너는(서블릿 컨테이너?) HttpServletRequest와 HttpServletResponse 객체를 생성한다.
3. 웹 서버로부터 요청 처리를 위임받은 웹 어플리케이션 서버는 해당 요청을 어떤 서블릿이 처리할 수 있는지
web.xml 을 기반으로 분석하고, 매칭되는 서블릿을 찾아 해당 서블릿이 메서드를 호출하여 요청을 처리한다.
ex. service() → 요청방식에 따른 메서드 호출, get방식이었다면 doGet() 을 호출한다.
4. 요청방식에 기반하여 호출된 메서드의 결과를 HttpServletResponse 객체에 담아 클라이언트에 반환한다.
DispatcherServlet(FrontController)
웹상에서 웹 브라우저로부터 http 형식의 요청이(request) 들어오면
해당 요청을 어떤 컨트롤러가 처리할 수 있는지 DispatcherServlet이 분석하고, 찾아낸다(HandlerMapping)
전달된 path? 값과 요청 방식에 기반하여 찾아낸 (컨트롤러의) 메서드를 호출하면서 요청 정보를 전달하고,
컨트롤러 --- 서비스 --- 레파지토리 등의 과정을 거치면서 요청을 처리하고,
결과를 모델에 담고 뷰에 대한 정보를 디스패쳐서블릿에게 반환한다.
모델에 담긴 정보는 view 파일에서 사용되어 최종 view가 만들어지고, 해당 문서는 웹 클라이언트에게 전달된다.
10. Controller
어떤 클래스에 @Controller 어노테이션을 사용하여 컨트롤러 역할을 부여하고,
요청 방식에 따라 매칭되는 메서드가 문자열 형식의 값을 반환하면 해당 값은 view 이름이다.
view 이름을 기반으로 resources 디렉토리의 template 디렉토리에서 해당 문서를 찾는다.
만약 순수하게 문자열을 반환하고 싶다면 해당 메서드에 @ResponseBody 애노테이션을 작성한다.
경로는 동일할 수 있으나 요청 방식은 달라야 한다. 모든 요청 방식마다 중복되는 경로가 존재한다면
클래스 레벨에서 @RequestMapping 어노테이션과 함께 중복되는 경로를 작성해준다.
Spring MVC에서 제공하는 @Controller
클래스 레벨에 작성하며 해당 클래스가 컨트롤러 역할을 하는 클래스임을 명시하는 어노테이션이다.
Spring MVC는 웹 어플리케이션을 만들 때 클라이언트의 요청에 응답하는 서버의 프로그램을 효율적으로 설계하기 위해
요청을 처리하는 과정에서 각각의 역할을 컨트롤러, 모델, 뷰로 분리한 설계구조를 의미하며
이 설계구조에 맞게 코드로 형식화 시켰다(하나의 프레임워크)
@Controller와 @RestController는 Spring MVC 프레임워크에서 사용가능한 어노테이션에 속하며
@Controller와 @RestController 어노테이션을 클래스 레벨에 작성함으로써
웹 클라이언트로부터 전달받은 요청을 매핑하고,
└ 요청한 자원에 기반하여 (해당 요청을 작업할) 메서드를 찾고, 찾은 메서드와 매핑한다.
웹 클라이언트로부터 자원을 요청받을 때 전달된 입력 값을(데이터를) 어떻게 받을지 지정하고,
예외 처리를 정의한다 → 예를 들어 클라이언트로부터 전달받은 요청에 문제가 있다면 오류코드가 4로 시작하고,
서버에 문제가 있다면 5로 시작하는데, 오류코드를 식별하여 오류가 발생했을 때의 상황을 프로그래밍한다.
@Controller 또는 @RestController 어노테이션 작성된 컨트롤러 역할임이 명시된 클래스들은
메서드의 반환타입과 매개변수에 있어 유연하게 정의할 수 있으며 기본 클래스를 상속하거나
특정한 인터페이스를 구현할 필요가 없다.
└ 다른 웹 프레임워크에서는 특정한 규칙이나 구조를 준수하여 컨트롤러 역할을 하는 클래스임을 명시할 수 있다는 것이다.
예를 들면 특정 클래스를 상속하거나 특정 인터페이스를 구현해야 해당 클래스가 컨트롤러 역할을 할 수 있게 된다.
Spring MVC 프레임워크에서는 클래스 레벨에 @Controller 또는 @RestController 어노테이션을 작성하는 것만으로
프레임워크가 해당 클래스를 컨트롤러로 인식하고, 컨트롤러에 필요한 기능을 구현해준다.
@Controller는 웹 페이지(View)를 반환하는 일반적인 컨트롤러임을 명시하는 어노테이션이다.
@RestController는 JSON 형식의 데이터를 반환하는 RESTful API 컨트롤러임을 명시하는 어노테이션이다.
/*
아래 HelloController 클래스가 컨트롤러임을 명시하는[등록하는] 어노테이션이다.
@Controller 어노테이션으로 HelloController는 컨트롤러 역할이 되었고,
컨트롤러 클래스에 작성하는 메서드의 반환타입과 매개변수는 유연하게 작성할 수 있으며
웹 클라이언트로부터 전달받을 요청방식과 경로를 기술하여 메서드와 매핑한다.
이 또한 @GetMapping @PostMapping @PutMapping @DeleteMapping 어노테이션으로
쉽게 매핑할 수 있다.
*/
@Controller
public class HelloController {
// GET방식, 경로는 도메인주소/hello 일 때,
// handle() 메서드가 호출되면서 Model 객체를 전달받는다.
@GetMapping("/hello")
public String handle(Model model) {
// Model 객체에 속성을 추가
model.addAttribute("message", "Hello World!");
// Model 객체를 포함하여 문자열 타입의 view name을 반환한다.
return "index";
}
}
@RequestMapping
@ResponseBody
@GetMapping @PostMapping @PutMapping @DeleteMapping
11. 스프링부트 프로젝트에서 정적 페이지를 반환하는 과정과
동적 페이지를 생성해서 반환하는 과정을 알아보기
타임리프는 동적인 페이지를 만들기 위한 라이브러리다. 타임리프 라이브러리를 사용한다면,
컨트롤러에서 html 파일을 찾을 때 기본적으로 resources 디렉토리의
templates 디렉토리 내부의 파일을 찾기때문에 static 폴더 안의 파일은 검색 대상에 제외된다.
static 폴더에 존재하는 파일에 접근하는 방법
1. url 경로로 직접 접근한다.
2. thymeleaf 라이브러리를 사용하지 않은 상태에서 컨트롤러를 거쳐서 반환한다.
3. thymeleaf 라이브러리를 사용한 상태에서 컨트롤러를 거쳐서 static 폴더에 있는 파일이 반환되려면
redirect: 기능으로 경로에 직접 static 폴더에 있는 html 파일을 입력했을 때 반환되는 값을 반환한다.
redirect로 웹 클라이언트에 반환된 문서는 Status Code의 앞자리가 3으로 시작한다.
*** 정적인 문서를 templates 폴더에 넣었을 때 컨트롤러에서 매칭된
메서드가 반환하는 값은 확장자를 제외한 문서명이 되어야 한다.
실습 코드
package com.sparta.springmvc.html;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HtmlController {
private static long visitCount = 0;
@GetMapping("/static-hello")
public String hello(){
// @Controller 어노테이션이 작성된 클래스 안에서
// 메서드가 String(문자열 타입)을 반환한다면
// 그 반환 값에 부합하는 페이지를 찾아서 반환한다.
// 단, thymeleaf 라이브러리가 사용된다면
// 컨트롤러에서 반환된 값은 resources > template 에 있는 파일의 일치여부에 사용되니
// static 폴더에 있는 파일들은 검색대상에 제외되어 /static-hello 경로로 요청이 들어왔을 때
// 요청에 응답할 파일이 static 폴더에 존재한다면 오류가 난다.
return "hello.html";
}
// 타임리프 라이브러리를 사용했을 때 static 폴더에 있는 문서를 웹 클라이언트에 반환하는 방법↓
// 반환 값을 resources > template 폴더에서 매칭하는 것이 아니라
// 서버에서 static 폴더에 존재하는 파일의 경로를 redirect함
@GetMapping("/html/redirect")
public String htmlStatic() {
return "redirect:/hello.html";
}
@GetMapping("/html/templates")
public String htmlTemplates(){
// templates 폴더에 존재하는 파일을 반환하는 경우
// 확장자는 제외하고, 파일명만 명시한다.
return "hello";
}
@GetMapping("/html/dynamic")
// view에 전달할 데이터는 Model 객체에 담는다.
public String htmlDynamic(Model model){
visitCount++;
model.addAttribute("visits", visitCount);
return "hello-visit";
}
}
12. 데이터를 클라이언트에 반환하기
json 형태는 서버에서 읽을 수가 없다. json 형태의 타입은 자바스크립트에서 읽을 수 있는 타입이다.
그래서 서버에서 json 형태로 클라이언트에 반환하려면
json 형태를 문자열 타입으로 만들어서 반환한다. ex. return "{\"name\": \"Robbie\", \"age\": \"95\"}";
1번 방식으로 반환된 데이터는 Content-Type이 text/html이다. Content-Type: text/html
문서(ex. *.html)를 반환하는 것이 아닌 데이터를 반환하려고 할 때
컨트롤러 역할을 하는 클래스에 작성하는 메서드 레벨에서
@ResponseBody 어노테이션을 작성해준다.
@ResponseBody 어노테이션을 작성한 뒤 해당 메서드가 반환하는 데이터의 타입이 객체라면
웹 클라이언트에 반환된 값의 Content-Type이 application/json 이다.
스프링은 내부적으로 자동으로 자바의 객체를 json 형태로 바꾼다.
그 때 Content-Type을 application/json 타입으로 반환한다.
Content-Type은 Response header에 실제 데이터는 Response body에 담긴다.
view name을 반환해야 하는 컨트롤러 클래스의 경우 @Controller 어노테이션을 작성해주고,
모든 메서드가 데이터를 반환하는 경우 해당 컨트롤러 클래스에 @RestController 어노테이션을 작성해준다.
13. jackson이란 무엇일까?
json 형태의 데이터 구조를 처리해주는 라이브러리다.
자바의 객체를 json 형태의 String으로 변환해줄 수 있고, json 형태의 String 값을 객체로 변환해줄 수 있다.
자바의 객체를 json 형태의 문자열 타입으로 만들고,
문자열 타입의 json 형태를 자바의 객체로 변환할 때
ObjectMapper 객체를 사용한다.
ObjectMapper 클래스는 Jackson 라이브러리에 존재한다.
자바의 객체를 문자열 타입의 json 형태로 만들때
ObjectMapper 객체의 writeValueAsString() 메서드를 호출하고,
이 때 대상 객체는 getter 메서드를 갖고 있어야 한다.
json 형태의 데이터를 자바의 객체로 변환할 때 ( JSON to Object )
변환하고자하는 객체의 모체인 클래스에 기본 생성자와
getter 메서드 또는 setter 메서드가 작성되어 있어야 한다.
웹 클라이언트로부터 전달된 json 형태의 데이터에서 key 값이 자바 객체의 필드와 일치해야 한다.
14. Path Variable과 Request Param 에 대해서
웹 클라이언트 서버로 http request 를 보낼 때 데이터를 함께 전달할 수 있다.
웹 클라이언트는 서버로 데이터를 전달할 수 있는 방식이 여러가지가 있다.
웹 클라이언트가 서버로 데이터를 보내는 각 방식을 서버에서 처리하는 방법에 대해 알아보기
데이터를 어떻게 보낼 것인지 프론트엔드와 백엔드 개발자는 서로 소통해서 데이터를 주고받아야 한다.
1. Path Variable 방식 @PathVariable
웹 클라이언트가 요청한 경로에 데이터가 묻어서 서버로 전달된다.
@GetMapping("/star/{name}/age/{age}")
@ResponseBody
// GET 방식, 웹 클라이언트가 요청한 경로를 작성,
// 웹 클라이언트로부터 전달되는 데이터를 중괄호{} 기호를 사용해서 변수에 담아내기
// 값을 담고 있는 변수와 메서드의 매개변수명과 일치하게 작성한다.
// http://localhost:8080/hello/request/start/서버로 전달할 데이터/age/서버로 전달할 데이터
public String helloRequestPath(@PathVariable String name,
@PathVariable int age) {
System.out.println("name: "+name+", age: "+age);
return String.format("Hello, @PathVariable. <br> name = %s, age = %d", name, age);
}
2. Request Param 방식, 쿼리스트링 방식이라고도 한다.
// Request Param으로 데이터 전달받기
// GET http://localhost:8080/hello/request/form/param?name=박성주&age=30
// 쿼리스트링방식으로 데이터를 전달할 때 ?(물음표)가 시작점,
// 그 뒤에 key와 value 형태로 바인딩되어 서버에 전달한다.
// 데이터간 값을 구별하는 것은 엠퍼센트(&)가 기준이 된다.
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam. <br> name = %s, age = %d", name, age);
}
html 문서에 form태그를 사용하면 url 요청을 할 수 있다.
<!-- 전송 버튼을 누르면 POST방식으로 action 속성에 작성한 값으로 서버에 url을 요청한다. -->
<form method="POST" action="서버로 요청할 url 주소">
...
<button>전송</button>
</form>
@RequestParam 어노테이션 생략이 가능하다.
@RequestParam 어노테이션 생략해도 데이터는 전달받을 수 있으나
작성한 파라미터의 갯수만큼 웹 클라이언트 쪽에서 데이터를 전달해야 서버에서 오류가 발생하지 않는다.
만약 데이터 전달이 필수가 아니라면 웹 클라이언트에서 해당 데이터 전달이
필수가 아니라는 것을 @RequestParam 어노테이션 속성을 통해 설정할 수 있다.
→ @RequestParam(required = false)
package com.sparta.springmvc.request;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/hello/request")
public class RequestController {
@GetMapping("/form/html")
public String helloForm() {
// http://localhost:8080/hello/request/form/html
return "hello-request-form";
}
@GetMapping("/star/{name}/age/{age}")
@ResponseBody
// GET 방식, 웹 클라이언트가 요청한 경로를 작성,
// 웹 클라이언트로부터 전달되는 데이터를 중괄호{} 기호를 사용해서 변수에 담아내기
// 값을 담고 있는 변수와 메서드의 매개변수명과 일치하게 작성한다.
// http://localhost:8080/hello/request/start/서버로 전달할 데이터/age/서버로 전달할 데이터
public String helloRequestPath(@PathVariable String name,
@PathVariable int age) {
System.out.println("name: "+name+", age: "+age);
return String.format("Hello, @PathVariable. <br> name = %s, age = %d", name, age);
}
// Request Param으로 데이터 전달받기
// GET http://localhost:8080/hello/request/form/param?name=홍길동&age=30
// 쿼리스트링방식으로 데이터를 전달할 때 ?(물음표)가 시작점,
// 그 뒤에 key와 value 형태로 바인딩되어 서버에 전달한다.
// 데이터간 값을 구별하는 것은 엠퍼센트(&)가 기준이 된다.
@GetMapping("/form/param")
@ResponseBody
// @RequestParam 어노테이션 생략 가능
// 단, 하기와 같이 웹 클라이언트로부터 전달하는 데이터가 필수가 아니라는 설정을 한다면
// @RequestParam 어노테이션은 생략이 불가하다.
// 만약 name이라는 매개변수에 데이터 전달이 되지 않으면 null이 된다.
public String helloGetRequestParam(@RequestParam(required = false) String name, int age) {
return String.format("Hello, @RequestParam. <br> name = %s, age = %d", name, age);
}
// POST 방식, http://localhost:8080/hello/request/form/param
// Header
// Content type: application/x-www-form-urlencoded
// Body
// name=홍길동&age=30
@PostMapping("/form/param")
@ResponseBody
public String helloPostRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam. <br> name = %s, age = %d", name, age);
}
}
'[부트캠프] kdt 심화 과정' 카테고리의 다른 글
2025년 3월 5일(수) (1) | 2025.03.05 |
---|---|
2025년 3월 4일(화) (0) | 2025.03.04 |
[스파르타코딩] 숙련 주차(2) (0) | 2025.02.11 |
[스파르타코딩] 스프링 입문과 숙련 주차(1) (1) | 2025.02.07 |
[스파르타코딩] 스프링 입문 주차(2) (1) | 2025.02.04 |