Backend/๐ŸŒฑ Spring

[Spring]ํŒŒ์ผ๊ตฌ์กฐ (์ค‘์š”)

HS0601 2025. 7. 29. 18:00

์ด์ฏค๋˜๋ฉด ํ”„๋กœ์ ํŠธ ์…‹์—…์€ ๊ฑฐ๋œฌํžˆ ํ•  ์ค„ ์•Œ์•„์•ผ ๋œ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ํ•ด๋ณด๋ ค๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต๋‹ค, ๊ฐ ํŒŒ์ผ๋ณ„๋กœ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

๐Ÿ“ฆcom.example.myproject
 โ”ฃ ๐Ÿ“‚controller      ← ์†๋‹˜ ์‘๋Œ€
 โ”ฃ ๐Ÿ“‚dto             ← ํฌ์žฅ๋œ ์š”์ฒญ/์‘๋‹ต
 โ”ฃ ๐Ÿ“‚entity          ← ์ง„์งœ ๋ฐ์ดํ„ฐ(๋ฌผ๊ฑด)
 โ”ฃ ๐Ÿ“‚config          ← ํ™˜๊ฒฝ ์„ค์ •
 โ”— ๐Ÿ“‚repository      ← ์ฐฝ๊ณ  (DB์™€ ์—ฐ๊ฒฐ)

 

๊ฐ ํด๋”/๊ณ„์ธต ์—ญํ•  ์š”์•ฝ

 

  • ๐Ÿ“ dto: ์‘๋‹ต/์š”์ฒญ ์—ญํ• ์„ ๋งก๊ณ  ์žˆ์Œ. ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ทธ๋ฆ‡๋“ค.
    • PostCreateRequestDto
      ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์‹œ๊ธ€์„ ์ƒˆ๋กœ ์ž‘์„ฑํ•  ๋•Œ, ์ œ๋ชฉ๊ณผ ๋‚ด์šฉ ๊ฐ™์€ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๊ทธ๋ฆ‡
    • PostResponseDto
      ์ €์žฅ๋œ ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ตํ•  ๋•Œ, ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ๊ณจ๋ผ์„œ ๋‹ด๋Š” ๊ทธ๋ฆ‡
    • PostUpdateRequestDto
      ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์‹œ๊ธ€์„ ์ˆ˜์ •ํ•  ๋•Œ, ์ˆ˜์ •๋œ ์ œ๋ชฉ๊ณผ ๋‚ด์šฉ์„ ๋‹ด๋Š” ์š”์ฒญ ๊ทธ๋ฆ‡

    ๐Ÿ“ entity: DB์™€ 1:1๋กœ ๋งคํ•‘๋˜๋Š” ํด๋ž˜์Šค
    • Post๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋งŒ๋“ค๊ณ 
      ์‹ค์ œ ๋ฐ์ดํ„ฐ(์ œ๋ชฉ, ๋‚ด์šฉ ๋“ฑ)๋ฅผ ์ €์žฅํ•  ํ•„๋“œ๋“ค์ด ๋“ค์–ด๊ฐ
      → ์ด ํด๋ž˜์Šค๊ฐ€ ์‹ค์ œ DB ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋จ

    ๐Ÿ“ repository: ์ƒ์„ฑ๋œ ๊ฒŒ์‹œ๊ธ€์„ ๋‹จ์ˆœํžˆ ์ €์žฅํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, CRUD(์ƒ์„ฑ/์กฐํšŒ/์ˆ˜์ •/์‚ญ์ œ)๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค  
    • save(), findById(), delete() ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ œ๊ณต๋จ
    • JPA๊ฐ€ ์•Œ์•„์„œ ๊ตฌํ˜„์ฒด ๋งŒ๋“ค์–ด์คŒ

    ๐Ÿ“ service: ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ, ์กฐํšŒ ๋“ฑ์˜ ํ•ต์‹ฌ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„
    • Controller์™€ Repository ์‚ฌ์ด์—์„œ ๋™์ž‘
    • ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์ž‘์—…์„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋‹ด๋‹น์ž

    ๐Ÿ“ controller: ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๊ฐ€์žฅ ๋จผ์ € ๋ฐ›๋Š” ๊ณณ, URL์„ ๋งคํ•‘ํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ๋Œ๋ ค์คŒ
    • ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์š”์ฒญ ์ง„์ž…์ 
    • REST API ๊ธฐ์ค€์œผ๋กœ๋Š” ์ฃผ๋กœ JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต์œผ๋กœ ๋Œ๋ ค์คŒ
      ์˜ˆ) @PostMapping("/posts") ์ด๋Ÿฐ ๊ฒŒ ์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌ๋จ

 

1. controller 

์‚ฌ์šฉ์ž ์š”์ฒญ ๋ฐ›๊ณ  ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ•˜๊ณ  ์‘๋‹ต์„ ๋Œ๋ ค์ฃผ๋Š” ๋ฌธ์ง€๊ธฐ

 

@RestController
@RequestMapping("/posts")
public class PostController {

    private final PostService postService;

    @PostMapping
    public PostResponseDto createPost(@RequestBody PostCreateRequestDto requestDto) {
        return postService.create(requestDto);
    }
}

 

2. dto

Entity๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๋„ ํฌํ•จ๋˜๋ฏ€๋กœ ์™ธ๋ถ€์—” ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ๋”ฐ๋กœ ๊ฐ์‹ธ์„œ ์ฃผ๊ณ  ๋ฐ›์Œ

 

Entity๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋‚˜ DB ๊ด€๋ จ ์„ค์ •์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์„œ, ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜๋ฉด ์œ„ํ—˜

๊ทธ๋ž˜์„œ ์™ธ๋ถ€ ํ†ต์‹ ์—๋Š” ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ๋‹ด์€ DTO๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค.

 

DTO๋Š” ๋‹จ๋…์œผ๋กœ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ๊ฐœ๋…์ด ์•„๋‹ˆ๋ผ ํ•ญ์ƒ Entity์™€ ํ•จ๊ป˜ ๋น„๊ต๋˜๋ฉด์„œ ์“ฐ์ธ๋‹ค.

์ฆ‰, 

Entity: ์ง„์งœ ๋ฐ์ดํ„ฐ(DB์™€ ์ง์ ‘ ์—ฐ๊ฒฐ)

DTO: ์ „์†ก์šฉ ๋ฐ์ดํ„ฐ (ํ”„๋ก ํŠธ์—”๋“œ์™€ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ)

@Getter
@AllArgsConstructor
public class UserResponseDto {
    private String username;  // password๋Š” ์ œ์™ธ
}

 

@Entity
public class User {
    @Id
    private Long id;

    private String username;
    private String password;  // ์ ˆ๋Œ€ ์™ธ๋ถ€์— ๋ณด์—ฌ์ฃผ๋ฉด ์•ˆ ๋จ
}

 

 

3. entity

DBํ…Œ์ด๋ธ”๊ณผ 1:1๋งคํ•‘๋จ

@Entity, @Id, @Colum ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜ ๋ถ™์Œ

 

@Entity
public class Post {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;

    // ์ƒ์„ฑ์ž, getter ๋“ฑ...
}

 

 

4. config

ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์ ์ธ ์„ค์ •: CORS, ํ•„ํ„ฐ, ์ธ์ฆ, ๋นˆ ๋“ฑ๋ก ๋“ฑ

์–˜๋Š” ์Šคํ”„๋ง์ด ์ž๋™์œผ๋กœ ์ฝ๋Š”๋‹ค.

 

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*");
    }
}

 

ํ๋ฆ„ ์ •๋ฆฌ

[์‚ฌ์šฉ์ž] → Controller → DTO → Service → Entity → Repository → DB ↓ ๊ฒฐ๊ณผ DTO ์‘๋‹ต

 

entity ์™€ dto๋ฅผ ๋”ฐ๋กœ ์จ์•ผ ํ•˜๋Š” ์ด์œ 

 

๋ณด์•ˆ๊ณผ ์—ญํ•  ๋ถ„๋ฆฌ

Entity๋Š” ๊ทธ๋Œ€๋กœ ์™ธ๋ถ€์— ์ฃผ๋ฉด DB๊ตฌ์กฐ๊ฐ€ ๋…ธ์ถœ๋จ