์ด ์๋ฆฌ์ฆ๋ Spring์์ Generic์ ์ด์ฉํ์ฌ CRUD ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํด๋ณด์.์ ์ด์ด์ง๋ ๊ธ ์ ๋๋ค.
- Generic(์ ๋๋ฆญ)์ ํต์ฌ๋ง ์ดํดํด๋ณด์.
- Spring์์ Generic์ ์ด์ฉํ์ฌ CRUD ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํด๋ณด์.
์ด ๊ธ์ ์ค์ ์ ๊ดํ ๊ธ์ด๊ณ ์ ๋๋ฆญ์ ๋ํ ์ด๋ก ์ด ๋ถ์กฑํ์ ๋ถ๋ค์ 1๋ฒ ๋งํฌ๋ฅผ ํตํด ์ถฉ๋ถํ ์์งํ๊ณ ์ค์๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
์ ๋ค๋ฆญ์ ์ค์ ์์ ์ฌ์ฉํด๋ณด์.
์ง๋ ์๊ฐ์ ๋ฐฐ์ด ์ ๋ค๋ฆญ์ ์ด์ด์ ์ด์ ์ค์ ์์ ์ฌ์ฉํด๋ณด๊ธฐ ์ํด ํ๊ฒฝ ๊ตฌ์ฑ์ ํด๋ณด์.
Jpa + Springboot + Mysql ์ฐ๋์ ๋ํด์๋
์ฐ๋ฆฌ๋ ๋ชจ๋ Http ํต์ ์ Header๋ผ๋ ๊ณตํต ๋ถ๋ถ์ด ๋ค์ด๊ฐ์ผ ํ๋ ๊ฒ์ ์๊ณ ์๋ค.
์๋๋ผ๋ฉด request, response ์ setHeader
๋ผ๋ ๋ฉ์๋๋ฅผ ํตํด ํค๋๋ฅผ ๊ด๋ฆฌํ๊ฒ ์ง๋ง ์ ๋ค๋ฆญ์ ์ดํด๋ฅผ ์ํด ์ง์ Header๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ๋ชจ๋ ์์ฒญ๊ณผ ์๋ต์ Header๋ฅผ ๋ถํ์ ์์ฑํด๋ณด์.
์ด๋ฌํ ๋ชจ๋ธ์ ํต์ ํ๋ ค๊ณ ํ๋๋ฐ ๋ชจ๋ ํต์ ์ด ์ด๋ฃจ์ด์ง ๋ ๋ง๋ค Header์ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๊ฐ ํ์ํ๋ค๊ณ ์๊ตฌํ๋ค.
- transaction_time (ํต์ ์๊ฐ)
- status (ํต์ ์ํ ์ฝ๋ OK, ERROR)
- description (์ธ๋ถ ๋ด์ฉ:: ํต์ ์ด ๋ฐ์ํ ์๋ฒ ์ฃผ์ฒด)
- data (๋ฐ์ดํฐ)
๊ทธ๋ผ ๋ชจ๋ ํต์ ์ Header๋ผ๋ ํด๋์ค์ ๋ด์์ Request์ Response๋ฅผ ์ํํ ๊ฒ์ธ๋ฐ ๋ค์๊ณผ ๊ฐ์ ํ์์ JSON์ผ๋ก ํต์ ์ด ์ด๋ฃจ์ด์ง ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๋ชจ๋ธ๋ง๋ค CRUD๋ฅผ ์ํํ๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ณตํต ๋ถ๋ถ์ ๋ฌถ์ด์ฃผ๋ CrudInterface ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด์ ๋ชจ๋ธ์ ๊ดํ Controller์์ ํต์ ์ ์ฐ๊ฒฐํด๋ณด์.
Overview
์๋๋ 3๊ฐ์ ์ํฐํฐ ํด๋์ค๋ฅผ ๋ชจ๋ ์์ฑํด์ผ ๋ง๋ ๊ฒ ์ด์ง๋ง ๊ฐ์ ์ฝ๋์ ๋ฐ๋ณต์ธ ์์ ์ผ๋ก ํ๋์ User์ ๊ด๋ จ๋ ์์ ์ผ๋ก ๋์ฒดํ๊ฒ ์ต๋๋ค. ๋จ์ง ์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋ถํ์ํ ์ค๋ณต์ ์ต์ํํ๋ ๊ณผ์ ์ด์ง ํด๋์ค๋ฅผ ๋ ์์ฑํ๋ค๊ณ ํด์ ํฌ์คํ ์ ์ง์ด ๋ฎ์์ง๋ ๊ฒ์ ์๋๋ผ๊ณ ํ๋จ๋์์ผ๋ฉฐ ๋ชจ๋ ์์ค์ฝ๋๊ฐ ํ์ํ์ ๋ถ๋ค์ ๋๊ธ์ ๋จ๊ฒจ์ฃผ์ธ์ :)
์ผ๋จ ์ด๋ค ํจํค์ง๊ฐ ์กด์ฌํ๋์ง ๋จผ์ ํ์ธํด๋ณด์.
- model
- controller
- service
- ifs
ํจํค์ง
model
๋ชจ๋ธ ํจํค์ง์๋ Entity, Repository๋ฑ๊ณผ ๊ฐ์ DB์ ๋งคํ๋๊ฑฐ๋ ํต์ ์ Body ๋ถ๋ถ์ ๋์ํ๋ ๊ฐ์ฒด๊ฐ ๋ด๊ธธ ํจํค์ง์ด๋ค.
Entity, Repository๋ฟ๋ง ์๋๋ผ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค๊ฒ ๋ ๋คํธ์ํฌ์ Header ๊ฐ์ฒด ๋ํ model ํจํค์ง์ ์กด์ฌํ๊ฒ ๋๋ค.
controller
controller ํจํค์ง๋ ์ ์๋์ถ์ด controller๊ฐ ์์นํ๊ฒ ๋ ํจํค์ง์ด๋ค.
service
service ํจํค์ง ๋ํ ์๋ค์ถ์ด controller์์ ์ฌ์ฉํ๊ฒ ๋ service logic์ด ๋ชจ์ฌ์๋ ํจํค์ง๋ผ๊ณ ์๊ฐํด๋์.
ifs
์ด ๋ถ๋ถ๊ณผ model ํจํค์ง๊ฐ ์ด๋ฒ ํฌ์คํ
์ ํต์ฌ์ธ ๋
์๋ค์ด๋ค.
์ฐ๋ฆฌ๋ ๋ชจ๋ ์๋น์ค ๋ก์ง์์ ๊ณตํต๋๋ ๋ถ๋ถ, ์ฆ CRUD๋ฅผ ํ๋์ ์ธํฐํ์ด์ค์์ ์์๋ฐ์ ์ ์๊ฒ ๊ฐ์ ํ ํ ๊ฒ์ด๋ค.
๊ทธ๋ฐ ์๋ฏธ์์ ifs ํจํค์ง๋ CrudInterface๋ผ๋ ์ธํฐํ์ด์ค๊ฐ ์กด์ฌํ ์ธํฐํ์ด์ค ํจํค์ง ์ด๋ค.
ํด๋์ค
ํด๋์ค๋ฅผ ํจํค์ง์ ํ์์ ์ด๋ค ํด๋์ค๊ฐ ์์์ง ๋จผ์ ์๊ฐํด๋ณด์.
๊ฐ์ฅ ์ฌ์ด controller, service๋ ๋จ์ง ์ ๋ ๋ก์ง์ ํด๋์ค๋ง ์์ ๊ฒ์ด๋ model์ ์ค์ ์ ์ผ๋ก ์ด์ผ๊ธฐ ํด๋ณด์.
model
- entity : ์ค์ DB์ ๋งคํ๋ JPA ์ํฐํฐ ํด๋์ค
- request : Header์ Data(Entity)๊ฐ ๊ฒฐํฉ๋์ด ์ค์ ํต์ ์ ํ์ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ Request ํด๋์ค
- response : Request๊ฐ ์๋น์ค ๋ก์ง์ ์ํด ๊ฐ๊ณต๋ Data๋ฅผ Header์ ๊ฒฐํฉ๋ Response ํด๋์ค
- header : ์์ฒญ์ ํ์ํ Header ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํด๋์ค
์ด๋ ๊ฒ 4๊ฐ์ง๊ฐ ์์นํ ๊ฒ์ด๋ค.
JPA ๊ตฌ์ฑ
๋จผ์ ๊ฐ๋จํ ํต์ ํ ์คํธ๋ก JPA๋ฅผ ๊ตฌ์ฑํด๋ณด์.
User
package com.example.demo.model;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
}
UserRepository
package com.example.demo.repository;
import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
์ด์ ๊ฐ๋จํ JPA๋ฅผ ์์ฑํ๊ณ , controller, service์์ CRUD๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํด๋ณด์
๋คํธ์ํฌ ๊ด๋ จ ๊ฐ์ฒด ์ค๋น
UserRequest
package com.example.demo.model.network;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserRequest {
private String account;
private String password;
private String name;
}
UserResponse
package com.example.demo.model.network;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserResponse {
private String account;
private String password;
private String name;
}
์ด๋ ๊ฒ ๋ ๊ฐ์ Request, Response ํด๋์ค๋ฅผ ๊ฐ๊ฐ ์์ฑํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ง์ Header ํด๋์ค๋ฅผ ์์ฑํ ์ฐจ๋ก
์ฌ๊ธฐ์ ์ ๋๋ฆญ์ด ์ด๋ป๊ฒ ์ฐ์ด๋?
๋ฐ๋ก ๊ณตํต๋ ๋ถ๋ถ์ Header์ ์ฌ์ฉํ๋ฉด ์ ๋๋ฆญ์ ์ข ๋ ์ฐ์ํ๊ฒ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค.
Header ํด๋์ค
Header ํด๋์ค๋
- transaction_time (ํต์ ์๊ฐ)
- status (ํต์ ์ํ ์ฝ๋ OK, ERROR)
- description (์ธ๋ถ ๋ด์ฉ:: ํต์ ์ด ๋ฐ์ํ ์๋ฒ ์ฃผ์ฒด)
๊ณผ ๊ฐ์ ๊ณตํต ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๊ณ , ๋งค ์์ฒญ๊ณผ ์๋ต๋ง๋ค ์ ๋ณด๋ฅผ ๋๊ฒจ์ผ ํ๋ฏ๋ก Header๋ผ๋ ํด๋์ค์ ํ๋๋ฅผ ์์ฑํ ์ ์๋ค.
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@SuppressWarnings("unchecked")
class Header {
private LocalDateTime transaction_time;
private String status;
private String description
}
์ฌ๊ธฐ์ ์ฒซ ๋ฒ์งธ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ์ ์๋ค.
ํค๋๋ ์์ฒญ๊ณผ ์๋ต์ ๊ฐ์ธ์ผ ํ๋ฏ๋ก Header ํด๋์ค์๋ UserApiRequest, UserApiResponse ํด๋์ค์ ํ์
๋ง ๋ค์ด์จ๋ค.
์ด๋ ์กฐ๊ธ ๋ ํ๋ํด์ ํด์ํ์๋ฉด ํค๋๋ ์ด์ฐจํผ ์์ฒญ๊ณผ ์๋ต์๋ง ๊ด์ฌ๋ฅผ ํ๋ ๋ฐ์ดํฐ ๊ฐ์ฒด์ด๋ฏ๋ก 2๊ฐ์ง์ ํ์
์ด ๋ค์ด์จ๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ ์ฐ๋ฆฌ๋ ํ์ ์ฒดํฌ๋ฅผ ์ํด ์ ๋๋ฆญ์ด๋ผ๋ ์ ํ์ง๋ฅผ ์ด์ฉํ ์ ์๋ค.
๊ธฐ์กด์ Header ํด๋์ค์์ ํ์ ์ ๋ถํ์ ์๋์ ๊ฐ์ด ๋ง๋ค์ด๋ณด์.
package com.example.demo.model.network;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@SuppressWarnings("unchecked")
public class Header<T> {
private LocalDateTime transaction_time;
private String status;
private String description;
}
์ฒซ ๋ฒ์จฐ์ ์ ๋๋ฆญ์ ์ฌ์ฉํด์ ์ปดํ์ผ ์์ ์ ํ์ ์ ์ฒดํฌํ ์ ์๊ฒ ํ๋ค.
์ด์ Header์ ๊ธฐ๋ฅ์ ์๋ฒฝํ๊ฒ ๋ง๋ค์ด๋ณด์.
์ฌ๊ธฐ์ ๋ง ํ๋ ์๋ฒฝํ๊ฒ๋ ๋ชจ๋ ์์ฒญ์ ํต์ ์๊ฐ, ํต์ ์ฝ๋, ์ถ์ , ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํด์
Header ํด๋์ค์์ Static์ผ๋ก ์์ฒญ์ ์ฑ๊ณต๊ณผ ์คํจ ์ฌ๋ถ๋ฅผ OK, ERROR ๋ฉ์๋๋ก ๋ถ๋ฆฌ์์ผ๋ณด์.
๋ฉ์๋๋ฅผ ์ ๋ค๋ฆญ ๋ฉ์๋๋ก ๋ง๋ค์ด์ฃผ๊ณ ๋จ์ ์ฑ๊ณต OK์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ์ฑ๊ณต OK(T data) ๊ทธ๋ฆฌ๊ณ ์คํจ ERROR() ์ด ์ธ ๊ฐ์ง์ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด๋ณด์.
package com.example.demo.model.network;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@SuppressWarnings("unchecked")
public class Header<T> {
private LocalDateTime transaction_time;
private String status;
private String description;
private T data; // ์ ๋ค๋ฆญ ๋ฐ์ดํฐ
public static <T> Header<T> OK(){
return (Header<T>)Header.builder()
.transaction_time(LocalDateTime.now())
.status("OK")
.description("From UserApi")
.build();
}
public static <T> Header<T> OK(T data) {
return (Header<T>) Header.builder()
.transaction_time(LocalDateTime.now())
.status("Data-OK")
.description("From UserAPI")
.build();
}
public static <T> Header<T> ERROR() {
return (Header<T>) Header.builder()
.transaction_time(LocalDateTime.now())
.status("ERROR")
.description("From UserAPI")
.build();
}
}
๊ณตํต ๋ถ๋ถ์ ํ๋์ Interface๋ก
๊ณตํต ๋ถ๋ถ์ธ CRUD๋ฅผ ํ๋์ CrudInterface๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด CrudInterface ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ค.
์ฌ๊ธฐ์๋ ์ ๋ค๋ฆญ์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋ฉด ์ข์์ง ์๊ฐํด๋ณด์.
์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ฉด ํน์ ๊ฐ์ฒด๋ง ๋ค์ด์ฌ ์ ์๊ฒ ์ ํํ ์ ์๋ค๊ณ ํ๋ค.
๊ทธ๋ผ ์ด๋ค ๋ฐ์ดํฐ๋ค์ด CrudInterface๋ฅผ ์ฌ์ฉํ ๊น?
์ ๋ต์ด๋ค.
๋ฐ๋ก UserRequest, UserResponse, ItemRequest, ItemResponse, OrderRequest, OrderResponse๊ฐ ์๋ค.
ํ์ง๋ง ์ด ์์ฒญ๊ณผ ์๋ต ๊ฐ์ฒด๋ค์ ์๋ก ํจ๊ป ์์ง์ฌ์ผ ํ๋ค.
๋ฌด์จ ๋ง์ด๋๋ฉด Request๊ฐ ๋ค์ด์ค๋ฉด Response๋ก ๋ฐํํ๋ ๊ฒ์ด ๊ธฐ๋ณธ ๋งค์ปค๋์ฆ์ด๋ค.
์ด๋ค ๋ชจ๋๋ฅผ ํฌํจํ ์ ์๋ ์ ๋ค๋ฆญ์ ๋ฐ๋ก <Request, Response>
์ด๋ค. ๊ทธ๋ผ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด๋ณด์
package com.example.demo.ifs;
public interface CrudInterface<Request, Response> {
Response create(Request request);
Response read(Long id);
Response update(Request request);
Response delete(Long id);
}
์ฌ๊ธฐ์ ์ ๊น, read()
์ delete()
๋ ์ request๊ฐ ์๋๋ผ ID ์ผ์ง ์๊ฐํด๋ณด์.
์ฐ๋ฆฌ๋ ์ฌ์ฉ์์ ๊ฒ์์ ๋ํ ์์ฒญ์ PathVariable ํํ๋ก ๋ฐ์ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฌ์ค์ ์์ฒญ ๋ฐ์ดํฐ์๋ url์ ๊ฒฝ๋ก๊ฐ ์ฌ์ฉ๋ ๊ฒ์ด๋ฏ๋ก ํต์ ๊ฐ์ฒด๊ฐ ์๋ Primitive ํํ์ด๋ฏ๋ก Long ํํ๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ฐ ์์ผ๋ก CRUD ๋ฉ์๋๋ง๋ค ์์ฒญ๊ณผ ์๋ต์ด ์๋ก ์กด์ฌํ๋ ํํ๊ฐ ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ๋ชจ๋ ์์ฒญ๊ณผ ์๋ต์ Header์ ์ํด ๊ฐ์ธ์ ธ์ผ ํ๋ค๊ณ ํ์ผ๋ฏ๋ก ์๋์ ๊ฐ์ด ๋ฐ๋๋๊ฒ ๋์ฑ ์ ์ ํ๋ค.
package com.example.demo.ifs;
import com.example.demo.model.network.Header;
public interface CrudInterface<Request, Response> {
Header<Response> create(Header<Request> request);
Header<Response> read(Long id);
Header<Response> update(Header<Request> request);
Header delete(Long id);
}
๋ง์ง๋ง delete ๋ฉ์๋์๋ responseํ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ ๋บด๋์.
์ด์ ๋ชจ๋ ์ค๋น๊ฐ ๋๋ฌ๋ค.
์ค์ ์๋น์ค๋ฅผ ๋ง๋ค๋ฉด์ ์ฐ๋ฆฌ๊ฐ ์์ํ๋ ์ฝ๋๊ฐ ์ ๋์ํ๋์ง ํ์ธํด๋ณด์.
Service ๊ตฌํ
UserService
package com.example.demo.service;
import com.example.demo.ifs.CrudInterface;
import com.example.demo.model.network.Header;
import com.example.demo.model.network.UserRequest;
import com.example.demo.model.network.UserResponse;
import com.example.demo.repository.UserRepository;
import org.springframework.stereotype.Service;
@Service
public class UserService implements CrudInterface<UserRequest, UserResponse> {
@Override
public Header<UserResponse> create(Header<UserRequest> request) {
return null;
}
@Override
public Header<UserResponse> read(Header<UserRequest> request) {
return null;
}
@Override
public Header<UserResponse> update(Header<UserRequest> request) {
return null;
}
@Override
public Header delete(Header<UserRequest> request) {
return null;
}
}
์ฐ๋ฆฌ๊ฐ ๋ง๋ ์๋น์ค ์ฝ๋์ CrudInterface ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ค๋ค๋ฉด ์๋ง ์์ ๊ฐ์ ์ํ์ ์ฝ๋๊ฐ ๋ํ๋๊ฒ ๋๋ค.
์ด์ ์์ค์ฝ๋๋ฅผ ๊ตฌํํ๋ ๊ณผ์ ๋ง ๋จ์๋ค.
create ๋ฉ์๋ ์์ฑ
create ๋ฉ์๋ ์์ฑ์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- request์์ Data ๋ถ๋ถ ๊ฐ์ ธ์ค๊ธฐ
- Data๋ถ๋ถ์ User ๊ฐ์ฒด์ ๋งคํ
- Jpa ๋ ํฌ์งํ ๋ฆฌ save
- response ๋ฐ์ดํฐ๋ก ๋ฐ๊พธ๊ธฐ
- Header์ Data ๋ถ๋ถ์ response๋ก ์ง์
@Override
public Header<UserResponse> create(Header<UserRequest> request) {
UserRequest userRequest = request.getData();
User user = User.builder()
.username(userRequest.getUsername())
.password(userRequest.getPassword())
.name((userRequest.getName()))
.build();
User newUser = userRepository.save(user);
UserResponse userResponse = UserResponse.builder()
.username(newUser.getUsername())
.password(newUser.getPassword())
.name(newUser.getName())
.build();
return Header.OK(userResponse);
}
read ๋ฉ์๋ ์์ฑ
read ๋ฉ์๋์ ์์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Path Variable์ ๊ฐ์ ํ ๋๋ก repository์ findById ์คํ
- ์คํ ๊ฒฐ๊ณผ๋ฅผ Header๊ฐ ํฌํจ๋ response๋ก ๋ณ๊ฒฝ
read ๋ฉ์๋๋ ํฐ ํ์ด ํ์ํ์ง ์์ง๋ง ์ฝ๊ฐ ๊น๋ค๋ก์ธ ์ ์๋๊ฒ, ๋๋ค์ ์ต์ํ์ง ์์ ์ฌ๋๋ค์ด ์ดํดํ๊ธฐ ํ๋ ์ฝ๋๊ฐ ๋์จ๋ค.
์ด๋ฒ์๊ฐ์ ๋๋ค์ ๋ํด ์ด์ผ๊ธฐํ๋๊ฒ ์๋๋ฏ๋ก ๋์ด๊ฐ๊ฒ ์ง๋ง ๋ธ๋ก๊ทธ์ ๋๋ค ๊ฒ์๊ธ์ ํตํด ํ์ตํด๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒฝํ์ด ๋ ๊ฒ์ด๋ค.
๋๊ธ