
(이번 섹션이 끝나고 답해보기)
1.스프링 프로젝트를 설정해 시작하고 실행할 수 있다,
2. 서버란 무엇인지, 네트워크와 HTTP,API는 무엇인지,JSON은 무엇인지 등 서버 개발에 필요한 다양한 개념을 이해한다.
3. 스프링 부트를 이용해 간단한 GET API,POST API를 만들 수 있다.
GET API에서는 데이터를 받을때 쿼리를 이용했었다.
POST API는 HTTP Body를 이용한다. body에 데이터를 담을때는 JSON(JavaScript Object Notation)이라는 문법을 사용한다.
객체 표기법, 즉 무언가를 표현하기 위한 형식이다.
{ "key": value }로 표기한다.(자바의 Map<Object, Object>와 유사)
{
“name”: “최태현”, //1. 속성은 각각 쉼표로 구분
“age”: 99,
“dogs”: [“코코”, “초코”],//2. JSON의 value에는 List가 올 수도 있다!
“house”: {
“address”: “대한민국 서울”,
“hasDoor”: true
}
//3. JSON의 value에는 다른 JSON이 올수도있다!
}
json 설명 1,2,3 주석 참고
POST/ multiply
Host: localhost:8080
} //HTTP 요청 바디
“number1”: 10,
“number2”: 20
}
이렇게 postman에서 post 요청을 보낼때 json 부분을 HTTP 요청 바디라고 부른다.
이제 곱셈 기능을 post api로 구현해보자.
먼저 api 명세를 설계하고 코딩을 하자.

곱셈의 경우도 결과값만 받아오면 되니 get을 사용해도되지만 연습을위해 post사용한다.

지난 강의에서 만들었던 CalculatorController 클래스에 POST API를 추가한다. 한 Controller Class에 여러 API를 추가할 수 있다.

get api를 만들때와 같이 Dto클래스를 만들어준다. 이 객체를 num1과 num2를 전달하는객체로 사용할것이다.
// 곱셈 API에서 사용할 DTO(Data Transfer Object) 클래스. 이 클래스는 클라이언트로부터 전달받은 데이터를 객체 형태로 관리하는 역할
package com.group.libraryapp.dto.calculator.request;
public class CalculatorMultiplyRequest {
private int number1;
private int number2;
public int getNumber2() {
return number2;
}
public int getNumber1() {
return number1;
}
}
그리고 아래와 같이 코드를 작성한다.
@PostMapping("/multiply") //POST
public int multiplyTwoNumbers( @RequestBody CalculatorMultiplyRequest request) {
return request.getNumber1()* request.getNumber2();
}
POST API에서 주의할점
: HTTP Body 데이터를 객체로 변환하려면 DTO 객체 앞에 @RequestBody 어노테이션을 반드시 추가해야 한다.
이를 추가하지 않으면 HTTP Body에 담긴 JSON 데이터를 DTO로 변환하지 못해 API가 정상적으로 동작하지 않는다.
GET API에서 @RequestParam이 필요한 것처럼, POST API에서는 @RequestBody가 필요하다.
먼저 서버를 켜주고,

post기때문에 쿼리가 아닌 body를 선택하고 raw에 JSON을 선택한다.

잘 작동한다!
HTTP Body에 있던 JSON이 @RequestBody를 통해 CalculatorMultiplyRequest에 매핑되고, Controller로 들어가 최종 결과를 반환해주었다.

1. 한 Controller Class에 여러 API를 추가할 수 있다.
2. @PostMapping(“/multiply”)
어노테이션 아래에 오는 함수를 HTTP Method가 POST이고 Path가/multiply인 API로 만든다.
3. @RequestBody
HTTP Body로 들어오는JSON을 CalculatorMultiplyRequest로 바꾼다.

7강부터 도서관리 API 개발함

다음과 같은 요구사항에 맞추어 개발할예정
서버를 실행한뒤 미리 강의에서주어진 웹UI를 접속하면

이렇게 프론트 코드가 실행됨 이제 유저생성 API를 개발하자

위와 같은 api설계에 맞춰 개발

controller안에 user패키지 만듬

그안에 UserController만듬
package com.group.libraryapp.controller.user;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@PostMapping("/user") //Post /user
public void saveUser() {
}
}
먼저 API라는걸 명시하기위해 @RestController 어노테이션을 써주고
POST니까 @PostMapping어노테이션을 써준다. 경로는 /user이고 반환값은 없어도 된다 했으니 void형식으로 씀
객체가 필요하니 dto만들러가자

dto폴더에 user.request만들고 UserCreateRequest만듬
private Integer age; 에서 integer에 대문자를 쓴이유는 null값도 받아도 되기때문. 대문자 Integer는 null값도 들어올 수 있음
그다음은 하던대로 getter로 name과 age만들어줌
다시 UserController로 돌아와서 Post니까 @RequestBody 어노테이션 적어주고 Dto클래스 써줌
이제 실제로 유저를 저장하게 해보자
유저 객체를 저장하기위해 domain패키지를 만들고 그안에 user패키지 그안에User클래스를 만든다. Post Api를 사용해서 유저정보를 저장하게 되면 여기에 User객체를 만들어서 리스트에 저장할것
User에 name과 age변수를 만들고 객체를 생성할 때 필수적인 초기값을 설정하고, 유효성을 검증하기 위해 생성자를 만들어준다.
생성자에서 name에는 null이 오면 안되니까 예외처리를 해준다. name이 null이거나 비어있으면 예외를 던져줌(throw)
다시 UserController로 돌아와서
@RestController
public class UserController {
private final List<User> users = new ArrayList<>();
@PostMapping("/user") //Post /user
public void saveUser(@RequestBody UserCreateRequest request) {
users.add(new User(request.getName(), request.getAge()));
}
}
private final List users = new ArrayList<>(); 유저를 담을 객체 생성
users.add(new User(request.getName(), request.getAge()));
dto에서 받아온 이름과 나이를 유효성검사가 통과되면 users객체에 추가함 문제없으면 추가되고 200ok반환하는듯?
다음강의에서 유저정보가 잘저장되었는지 확인해보는 유저정보조회 get api를 만들어보자
1-1. UserController (컨트롤러 계층)
HTTP 요청을 받아 처리하는 역할
요청 데이터를 DTO를 통해 받고, User 객체를 생성한 후 users 리스트에 저장
1-2. UserCreateRequest (DTO)
클라이언트가 보낸 데이터를 담는 Data Transfer Object
필드 값은 JSON 데이터와 매핑되며, getter를 통해 값을 읽을 수 있음
1-3. User (도메인 모델)
애플리케이션의 핵심 데이터 모델
데이터를 표현하고, 유효성 검증을 수행
2-1. UserController
@RestController
public class UserController {
private final List<User> users = new ArrayList<>(); // User 객체를 저장하는 메모리 리스트
@PostMapping("/user") // POST 요청이 /user로 들어오면 이 메서드가 실행됨
public void saveUser(@RequestBody UserCreateRequest request) {
users.add(new User(request.getName(), request.getAge())); // User 객체 생성 후 리스트에 추가
}
}
@RestController: 이 클래스가 HTTP 요청을 처리하는 REST 컨트롤러임을 나타냄
List users: 메모리상에 User 객체를 저장하는 임시 저장소
이 리스트는 프로그램이 종료되면 사라짐(user 리스트는 자바 프로그램의 메모리에 생성되고 이는 프로그램이 종료되면 초기화되기 때문 나중에 MySQL이런것과 연결할듯?)
@PostMapping("/user"): 클라이언트가 /user 경로로 POST 요청을 보내면 이 메서드가 실행됨
@RequestBody: 클라이언트의 JSON 데이터를 UserCreateRequest 객체로 변환줌
users.add(new User(...)): UserCreateRequest의 데이터를 이용해 domain.user.User 객체를 생성하고 리스트에 저장함
2-2. UserCreateRequest (DTO)
public class UserCreateRequest {
private String name;
private Integer age;
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
DTO (Data Transfer Object):
클라이언트가 보낸 데이터를 컨트롤러에 전달하기 위한 객체입
name과 age 필드를 가지며, 클라이언트 JSON의 필드와 매핑됨
getName()과 getAge():
@RequestBody에 의해 UserCreateRequest 객체가 생성되면, getter를 통해 값을 읽을 수 있음
2-3. User (도메인 모델)
public class User {
private String name;
private Integer age;
public User(String name, Integer age) {
if (name == null || name.isBlank()) {
throw new IllegalArgumentException(String.format("잘못된 name(%s)이 들어왔습니다.", name));
}
this.name = name;
this.age = age;
}
}
설명:
도메인 모델: User 클래스는 애플리케이션의 핵심 데이터를 표현하는 객체
생성자: new User(name, age)로 객체를 생성할 때 호출됨
생성자 안에서 name 값이 null이거나 비어 있는 경우 예외를 발생시켜 유효성 검증을 수행
필드:name과 age는 사용자 정보를 저장하는 필드
클라이언트 요청:
클라이언트가 /user 경로로 다음과 같은 JSON 데이터를 POST 요청으로 보낸다:
{
"name": "Alice",
"age": 25
}
UserCreateRequest 객체 생성:
@RequestBody 어노테이션 덕분에 JSON 데이터가 UserCreateRequest 객체로 변환됨.
User 객체 생성:
request.getName()과 request.getAge()를 호출해 값을 가져온 뒤, new User(name, age)를 통해 User 객체를 생성한다.
이때 User 생성자의 유효성 검증이 실행된다.
메모리 저장:
생성된 User 객체는 users 리스트에 추가된다.

이 api를 호출하면 전체 유저정보를 전부 줄거기 때문에 쿼리없음(= 함수의 매개변수 없음)
결과반환은 사용자를 표현한 객체들이 쭉들어있음
이러한 api스펙을보고 2가지 기억할점은 아래와 같다.
api스펙에서 결과반환이 리스트안에 객체들이 들어있는 형태, 즉 json인데 그 이유는 Controller에서 getter가 있는 객체를 반환하면 JSON이 되기때문

-강의에서 Fruit Api를 만들어서 실습을 통해 확인해봤음

getter와 생성자 만들어줌 (클래스위치는 잠깐 이해를 위한 실습이라 아무데나 생성함)

그후 UserController에서 그냥 fruit api를 하나 뚫어뒀음 위 사진처럼 import가 안돼있을때 alt+enter로 임포트 가능
![]() | ![]() |
|---|
get api로 객체를 반환하도록 간단하게 만듬 서버켜서 postman으로 send해보니 name과price가 JSON형식으로 응답바디에 담겨서 온걸 확인할 수있었다.
Controller에서 getter가 있는 객체를 반환하면 JSON이 되는 것은 @RestController 어노테이션 클래스를 붙여준 덕분에 가능한 일임
api 스펙을 보면 id라는것이 있는데 우리가 만든 유저 객체에는 name과 age만 있고 id는없다. id는 일반적으로 각 데이터들끼리 겹치지않는 유일한 번호를 이야기한다. 이렇게 하기위해 List에 담겨있는 유저의 순서를 id로 넣어서 반환해주면 되겠다!
코드설명 section01 pdf 29p 참고
dto user에서 response패키지를 만들고 userResponse 생성자를 만들때 매개변수를 String name, Integer age로 만들었다가 그렇게 되면 Controller에서 id를 추가하는 함수를 만들때도 users.get(i).getName(),users.get(i).getAge()이런식으로 번거로워 지기때문에 name과 age를 따로쓴 매개변수를 지우고 User user로 개선함 (강의 7분대)
![]() | ![]() |
|---|
이렇게 사용자를 두명 넣으면 api를 구현했기때문에 잘작동하고

목록에서도 등록한 사용자가 잘 보인다!
(학습목표가 지금까지의 강의 section01정리임)
서버를 껐다 다시킨다음에 새로고침하면 목록에 사용자 정보가 사라지게됨 ㅋㅋ
=> 유저정보는 메모리에서만 유지되고있기때문에 이러한 현상이 이루어짐
이런 현상이 왜 일어나는지, 어떻게 개선하는지는 다음 섹션에서!
1.스프링 프로젝트를 설정해 시작하고 실행할 수 있다,
2. 서버란 무엇인지, 네트워크와 HTTP,API는 무엇인지,JSON은 무엇인지 등 서버 개발에 필요한 다양한 개념을 이해한다.
3. 스프링 부트를 이용해 간단한 GET API,POST API를 만들 수 있다.
=>3가지 전부 벨로그 강의 정리에 녹아있다!