Home > Spring > ๐Ÿƒ[Spring] ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œ์ผœ API๋ฅผ ๋™์ž‘์‹œํ‚ค๊ธฐ๊นŒ์ง€ ์ผ์–ด๋‚˜๋Š” ์ผ

๐Ÿƒ[Spring] ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œ์ผœ API๋ฅผ ๋™์ž‘์‹œํ‚ค๊ธฐ๊นŒ์ง€ ์ผ์–ด๋‚˜๋Š” ์ผ
Spring Framework

๐Ÿƒ[Spring] ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œ์ผœ API๋ฅผ ๋™์ž‘์‹œํ‚ค๊ธฐ๊นŒ์ง€ ์ผ์–ด๋‚˜๋Š” ์ผ

Java ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œ์ผœ API๋ฅผ ๋™์ž‘์‹œํ‚ค๊ธฐ๊นŒ์ง€๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ๊ณผ์ •์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
์ด ๊ณผ์ •์€ ์ฃผ๋กœ Spring Boot์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.
์ „์ฒด ํ๋ฆ„์€ ์„œ๋ฒ„ ์‹œ์ž‘์—์„œ API ์š”์ฒญ ์ฒ˜๋ฆฌ๊นŒ์ง€์˜ ๊ณผ์ •์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ™‹โ€โ™‚๏ธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฐจ์ด์ 

1๏ธโƒฃ ์„œ๋ฒ„ ์‹œ์ž‘.

  • Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋จผ์ € ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Spring Boot์—์„œ๋Š” SpringApplication.run() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์˜ˆ์‹œ

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
  • @SpringBootApplication ์• ๋„ˆํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋Š” Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž…์ (Entry Point) ์—ญํ• ์„ ํ•˜๋ฉฐ, SpringApplication.run() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ํ†ฐ์ผ“(Tomcat) ๊ณผ ๊ฐ™์€ ์ž„๋ฒ ๋””๋“œ ์›น ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ž„๋ฒ ๋””๋“œ ์›น ์„œ๋ฒ„ ์‹คํ–‰.

  • ์ž„๋ฒ ๋””๋“œ ํ†ฐ์ผ“ ์„œ๋ฒ„๋Š” Spring Boot์— ํฌํ•จ๋œ ๊ธฐ๋ณธ ์›น ์„œ๋ฒ„๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ„๋„๋กœ ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ง€์ •๋œ ํฌํŠธ(๊ธฐ๋ณธ์ ์œผ๋กœ 8080)์—์„œ ํด๋ผ์ด์–ธํŠธ HTTP ์š”์ฒญ์„ ์ˆ˜์‹ ํ•  ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๊ณผ์ •์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.
      • ์„œ๋ฒ„๊ฐ€ ํฌํŠธ๋ฅผ ์—ด๊ณ , ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” HTTP ์š”์ฒญ์„ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
      • Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์— ์ •์˜๋œ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋งคํ•‘๋œ URL์„ ๋“ฑ๋กํ•˜์—ฌ ์–ด๋–ค ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ์–ด๋–ค ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”.

  • Spring Boot๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๋ฉด์„œ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection) ๊ณผ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”(Component Scan) ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์ •์˜๋œ Bean(๊ฐ์ฒด) ๋“ค์„ ์ฐพ์•„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(Application Context) ์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
    • ์˜์กด์„ฑ ์ฃผ์ž…
      • ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋น„์Šค(Service)๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ(Controller)์— ์ž๋™์œผ๋กœ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ ์Šค์บ”
      • @Controller, @Service, @Repository ๊ฐ™์€ ์• ๋„ˆํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ •์˜๋œ Bean์„ ์ฐพ์•„์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ URL ๋งคํ•‘ ๋ฐ ๋ผ์šฐํŒ… ์„ค์ •.

  • Spring Boot๋Š” @RestController์™€ ๊ฐ™์€ ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ API ์•ค๋“œํฌ์ธํŠธ์™€ HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE) ๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋˜๋ฉด, URL ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ์–ด๋–ค ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ ์ง€ ๋ผ์šฐํŒ… ์ •๋ณด๊ฐ€ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ: ์ปจํŠธ๋กค๋Ÿฌ ์„ค์ •.

@RestController
@RequestMapping("/api")
public class UserController {
    
    @GetMapping("/users")
    public List<User> getAllUsers() {
        // ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜
        return userService.getAllUsers();
    }
}
  • /api/users๋กœ ๋“ค์–ด์˜ค๋Š” GET ์š”์ฒญ์€ getAllUsers() ๋ฉ”์„œ๋“œ๋กœ ๋ผ์šฐํŒ…๋ฉ๋‹ˆ๋‹ค.
  • Spring์€ DispatcherServlet์ด๋ผ๋Š” ์ค‘์•™ ์ œ์–ด ์—ญํ• ์„ ํ•˜๋Š” ์„œ๋ธ”๋ฆฟ์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” HTTP ์š”์ฒญ์„ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ „๋‹ฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ฒ˜๋ฆฌ.

  • ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋œ ํ›„, ํด๋ผ์ด์–ธํŠธ(์˜ˆ: ์›น ๋ธŒ๋ผ์šฐ์ €, Postman) ๊ฐ€ HTTP ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ API ์—”๋“œํฌ์ธํŠธ(์˜ˆ: /api/users)๋กœ GET ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • 1. HTTP ์š”์ฒญ ์ˆ˜์‹ 
      • ํ†ฐ์ผ“ ์„œ๋ฒ„๋Š” ์ง€์ •๋œ ํฌํŠธ(์˜ˆ: 8080)์—์„œ HTTP ์š”์ฒญ์„ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.
    • 2. DispatcherServlet์œผ๋กœ ์ „๋‹ฌ
      • ์š”์ฒญ์€ Spring์˜ DispatcherServlet์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
      • DispatcherServlet์€ ์ค‘์•™ ์ œ์–ด ์—ญํ• ์„ ํ•˜๋ฉฐ, ์š”์ฒญ์„ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • 3. ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ ์‹คํ–‰
      • ์š”์ฒญ๋œ URL๊ณผ HTTP ๋ฉ”์„œ๋“œ(GET, POST ๋“ฑ)์— ๋งž๋Š” ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด, /api/users๋กœ ๋“ค์–ด์˜จ GET ์š”์ฒญ์€ getAllUsers() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
    • 4. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์‹คํ–‰
      • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค ๊ณ„์ธต์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
      • ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ, ์„œ๋น„์Šค๋Š” Repository๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    • 5. ์‘๋‹ต ์ƒ์„ฑ
      • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
      • Spring Boot๋Š” ์ž๋™์œผ๋กœ Java ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™”(Serialization)ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ: ์š”์ฒญ ๋ฐ ์‘๋‹ต.

  • ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ.
    GET http://localhost:8080/api/users
    
  • ์„œ๋ฒ„ ์‘๋‹ต
    [
      {
          "id": 1,
          "name": "Kobe",
          "email": "kobe@example.com"
      },
      {
          "id": 2,
          "name": "MinSeong",
          "email": "minseong@example.com"
      }
    ]
    

6๏ธโƒฃ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™(Optional_

  • ์š”์ฒญ์— ๋”ฐ๋ผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, JPA๋‚˜ Hibernate์™€ ๊ฐ™์€ ORM(Object-Relational Mapping) ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ์˜ˆ์‹œ(Repository ์‚ฌ์šฉ)

@Repository
public interface UserRepository extend JpaRepository<User, Long> {
}
  • ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ UserRepository๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

7๏ธโƒฃ ์‘๋‹ต ์ „์†ก ๋ฐ ์ข…๋ฃŒ

  • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ DispatcherServlet์ด ๋ฐ›์•„์„œ ์ ์ ˆํ•œ HTTP ์‘๋‹ต(Response) ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์‘๋‹ต ๋ฐ์ดํ„ฐ๋Š” JSON์œผ๋กœ ๋ณ€ํ™˜๋œ ํ›„, HTTP ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ 200 OK ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ JSON ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

8๏ธโƒฃ ์š”์•ฝ

  • Java ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ API๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ณผ์ •์€ ํฌ๊ฒŒ ์„œ๋ฒ„ ์‹คํ–‰, ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”, URL ๋งคํ•‘, ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ฒ˜๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ์‘๋‹ต ์ „์†ก์˜ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์š”์ฒญ์„ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๋กœ ๋ผ์šฐํŒ…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.