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 맀핑, ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­ 처리, 그리고 응닡 μ „μ†‘μ˜ λ‹¨κ³„λ‘œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­μ„ 보내면 μ„œλ²„λŠ” ν•΄λ‹Ή μš”μ²­μ„ μ μ ˆν•œ 컨트둀러 λ©”μ„œλ“œλ‘œ λΌμš°νŒ…ν•˜μ—¬ 데이터λ₯Ό μ²˜λ¦¬ν•˜κ³ , κ·Έ κ²°κ³Όλ₯Ό μ‘λ‹΅μœΌλ‘œ λ°˜ν™˜ν•˜λŠ” 일련의 과정이 μˆ˜ν–‰λ©λ‹ˆλ‹€.