๊ทธ๋ฃน์คํฐ๋์์ '๋ฌด์์ ๊ฒ์ํ ๋ง๋ค๊ธฐ'ํ๋ก์ ํธ๋ฅผ ์งํ์ค์ด๋ค.
์ฌ์ค ๋๋ ์๋ฐ๋ก ํ ์ดํ๋ก์ ํธ๊น์ง๋ ํด๋ณธ ๊ฒฝํ์ด์์ง๋ง Spring, SpringBoot๋ ์ ํ ์ฌ์ฉ๊ฒฝํ์ด ์์ด
ํ๋ํ๋ ๋ชจ๋ ๋ง๋งํ์ง๋ง ์คํฐ๋ ํ์ฅ๋์ ์์ฒญ๋ ์บ๋ฆฌ๋ก ์กฐ๊ธ์ฉ ์ดํดํ๊ณ ์๋ ์ค์ด๋ค. ๊ฐ์ฌํจ๋๋ค..
๋ฌด์์ JPA๋ฅผ ํ์ฉํด CRUD๊ฒ์ํ์ ๋ง๋ค๊ณ ๊ธฐ๋ฅ๊ตฌํ๊น์ง ํด๋ณด์๋ค !
๊น๋จน์ง ์๊ธฐ ์ํด ํฌ์คํ
์ ๋จ๊ธด๋ค. :)
ํ๋ก์ ํธ์ ํจํค์ง๋ ๋ค์๊ณผ ๊ฐ๋ค.
: Swagger์ ์ค์ ํ์ผ์ด ๋ด๊ธด ํจํค์ง์ด๋ค.
: ์น MVC์ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ ํด๋์ค๋ค์ด ๋ด๊ฒจ์๋ค.
: Request(์์ฒญ), Response(์๋ต)DTO๋ฅผ ์ ์ํ ํด๋์ค์ด๋ค.
: ํ
์ด๋ธ๊ณผ ๋งํฌ๋ ํด๋์ค์์ ๋ํ๋ธ๋ค.
Entity ํด๋์ค ๋๋ ๊ฐ์ฅ Coreํ ํด๋์ค๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Entity ํด๋์ค์ DTO ํด๋์ค๋ฅผ ๋ถ๋ฆฌํ๋ ์ด์
- View Layer ์DB Layer์ ์ญํ ์ ์ฒ ์ ํ๊ฒ ๋ถ๋ฆฌํ๊ธฐ ์ํด์
ํ ์ด๋ธ๊ณผ ๋งคํ๋๋ Entity ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ฌ๋ฌ ํด๋์ค์ ์ํฅ์ ๋ผ์น๊ฒ ๋๋ค. ํ์ง๋ง View์ ํต์ ํ๋ DTO ํด๋์ค(Request / Response ํด๋์ค)๋ ์์ฃผ ๋ณ๊ฒฝ๋๋ฏ๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค.- Domain Model์ ์๋ฌด๋ฆฌ ์ ์ค๊ณํ๋ค๊ณ ํด๋ ๊ฐ View ๋ด์์ Domain Model์ getter๋ง์ ์ด์ฉํด์ ์ํ๋ ์ ๋ณด๋ฅผ ํ์ํ๊ธฐ๊ฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ Domain Model ๋ด์ Presentation์ ์ํ ํ๋๋ ๋ก์ง์ ์ถ๊ฐํ๊ฒ ๋๋๋ฐ, ์ด๋ฌํ ๋ฐฉ์์ด ๋ชจ๋ธ๋ง์ ์์์ฑ์ ๊นจ๊ณ Domain Model ๊ฐ์ฒด๋ฅผ ๋ง๊ฐ๋จ๋ฆฌ๊ฒ ๋๋ค.- ๋ํ Domain Model์ ๋ณต์กํ๊ฒ ์กฐํฉํ ํํ์ Presentation ์๊ตฌ์ฌํญ๋ค์ด ์๊ธฐ ๋๋ฌธ์ Domain Model์ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ ต๋ค.
- ์ฆ DTO๋ Domain Model์ ๋ณต์ฌํ ํํ๋ก, ๋ค์ํ Presentation Logic์ ์ถ๊ฐํ ์ ๋๋ก ์ฌ์ฉํ๋ฉฐ Domain Model ๊ฐ์ฒด๋ Persistent๋ง์ ์ํด์ ์ฌ์ฉํ๋ค.
: JPA์์์ DB Layer ์ ๊ทผ์๋ฅผ ์๋ฏธํ๋ค.
์ธํฐํ์ด์ค๋ฅผ ์์ฑ ํ JpaRepository<Entity ํด๋์ค, PK ํ์
>์ ์์ํ๋ฉด ๊ธฐ๋ณธ์ ์ธ CRUD ๋ฉ์๋๊ฐ ์๋์ผ๋ก ์์ฑ๋๋ค.
@Repository๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์๋ค.
: ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ค. Service์ธํฐํ์ด์ค๋ฅผ ๋๊ณ ServiceImpl๋ก ์ด๋ฅผ ๊ตฌํํ์๋ค.
interface์ ๊ตฌํ์ฒด๋ก ๋๋๋ ์ด์ ๋ ์ฌ๊ธฐ์ ๋ณด๋ค ์์ธํ ๋์์๋ค !
Attribute(์์ฑ)๋ ์ด 5๊ฐ์ด๋ค.
- id (๊ธฐ๋ณธํค)
- brand_name
- category
- land_number
- road_number
healthInfo.java
package com.example.demo.domain;
import lombok.*;
import javax.persistence.*;
import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Getter
@Entity
@Table(name = "health_info")
public class HealthInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String brand_name;
private String land_number;
private String road_number;
private String category;
public void modifyHealthinfo(String brand_name,String land_number,String road_number, String category){
this.brand_name=brand_name;
this.land_number=land_number;
this.road_number=road_number;
this.category=category;
}
}
๊ด๋ จ ์ด๋ ธ์ผ์ด์
@NoArgsConstructor
: ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ๊ธฐ๋ณธ ์์ฑ์ ์์ฑ@AllArgsConstructor
: ๋ชจ๋ ํ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ์์ฑ์ ์์ฑ@ToString
: ํด๋์ค์ ๋ณ์๋ค์ ๊ธฐ๋ฐ์ผ๋ก ToString ๋ฉ์๋ ์๋์ผ๋ก ์์ฑ@Builder
: ํด๋น ํด๋์ค์ ๊ฐ์ฒด ์์ฑ์ Buliderํจํด ์ ์ฉ์์ผ์ค, ๋ชจ๋ ๋ณ์๋ค์ ๋ํด bulidํ๊ธฐ ์ํ๋ค๋ฉด ํด๋์ค์์ @bulid
๋ถ์ด๊ณ ํน์ ๋ณ์๋ง bulidํ๊ธฐ ์ํ๋ค๋ฉด ์์ฑ์๋ฅผ ์์ฑํ๊ณ ๊ทธ ์์ @bulid
๋ฅผ ๋ถ์ธ๋ค ! @Getter
: ๋ชจ๋ ๋ณ์๋ค์ Getter๋ฉ์๋ ์๋ ์์ฑ@Entity
,@Table
: ๊ฐ์ฒด์ ํ
์ด๋ธ ๋งคํ DTO(Data Transfer Object)๋ ๊ณ์ธต๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ์ํด ์ฌ์ฉํ๋ ๊ฐ์ฒด(Java Beans)์ด๋ค.
์ ๋ฆฌํ๋ฉด DTO๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ํฌํจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์๋ฒ ์ธก์ ์ ๋ฌํ๊ณ , ์๋ฒ ์ธก์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ด์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ ๊ณ์ธต๊ฐ ์ ๋ฌ์ ์ญํ ์ด๋ค.
๊ณ์ธต๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ์ํ ๊ฐ์ฒด(Java Beans)์ด๋ค.
DB์์ ๋ฐ์ดํฐ๋ฅผ ์ป์ด Service๋ Controller ๋ฑ์ผ๋ก๋ถํฐ ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
์ฆ, DB์ ๋ฐ์ดํฐ๊ฐ Presentation Logic Tier๋ก ๋์ด์ค๊ฒ ๋ ๋๋ DTO์ ๋ชจ์ต์ผ๋ก ๋ฐ๊ปด์ ์ค๊ณ ๊ฐ๋ ๊ฒ์ด๋ค.
๋ก์ง์ ๊ฐ๊ณ ์์ง ์๋ ์์ํ ๋ฐ์ดํฐ ๊ฐ์ฒด์ด๋ฉฐ, getter/setter ๋ฉ์๋๋ง์ ๊ฐ๋๋ค.
ํ์ง๋ง DB์์ ๊บผ๋ธ ๊ฐ์ ์์๋ก ๋ณ๊ฒฝํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ DTOํด๋์ค์๋ setter๊ฐ ์๋ค. (๋์ ์์ฑ์์์ ๊ฐ์ ํ ๋นํ๋ค.)
- Request์ Response์ฉ DTO๋ View๋ฅผ ์ํ ํด๋์ค
- ์์ฃผ ๋ณ๊ฒฝ์ด ํ์ํ ํด๋์ค
- Presentation Model
- toEntity() ๋ฉ์๋๋ฅผ ํตํด์ DTO์์ ํ์ํ ๋ถ๋ถ์ ์ด์ฉํ์ฌ Entity๋ก ๋ง๋ ๋ค.
- ๋ํ Controller Layer์์ Response DTO ํํ๋ก Client์ ์ ๋ฌํ๋ค.
HealthRequestDTO.java
package com.example.demo.data.request;
import com.example.demo.domain.HealthInfo;
import lombok.Getter;
@Getter
public class HealthRequestDTO {
private Long id;
private String brand_name;
private String land_number;
private String road_number;
private String category;
public static HealthInfo toEntity(HealthRequestDTO dto){
return HealthInfo.builder()
.id(dto.getId())
.brand_name(dto.getBrand_name())
.category(dto.getCategory())
.land_number(dto.getLand_number())
.road_number(dto.getRoad_number())
.build();
}
}
HealthResponseDTO.java
package com.example.demo.data.response;
import com.example.demo.domain.HealthInfo;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Builder
@Getter
@Setter
@ToString
public class HealthResponseDTO {
private Long id;
private String brand_name;
private String land_number;
private String road_number;
private String category;
public static HealthInfo toEntity(HealthResponseDTO healthResponseDTO){
return HealthInfo.builder()
.id(healthResponseDTO.getId())
.brand_name(healthResponseDTO.getBrand_name())
.land_number(healthResponseDTO.getLand_number())
.road_number(healthResponseDTO.getRoad_number())
.category(healthResponseDTO.getCategory())
.build();
}
}