Home > Spring > πŸƒ[Spring] Controllerμ—μ„œ getterκ°€ μžˆλŠ” 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄ JSON이 λœλ‹€?!

πŸƒ[Spring] Controllerμ—μ„œ getterκ°€ μžˆλŠ” 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄ JSON이 λœλ‹€?!
Spring Framework

πŸƒ[Spring] Controllerμ—μ„œ getterκ°€ μžˆλŠ” 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄ JSON이 λœλ‹€?!

  • Controllerμ—μ„œ getterκ°€ μžˆλŠ” 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄ 기본적으둜 JSON으둜 λ³€ν™˜λ˜μ–΄ ν΄λΌμ΄μ–ΈνŠΈμ— μ „λ‹¬λ©λ‹ˆλ‹€.
    • 이 λ™μž‘μ€ Spring Frameworkμ—μ„œ μžλ™μœΌλ‘œ μ²˜λ¦¬ν•΄μ€λ‹ˆλ‹€.

1️⃣ Springμ—μ„œ 객체가 JSON으둜 λ³€ν™˜λ˜λŠ” κ³Όμ •.

1. 객체 λ°˜ν™˜ 및 @RestController

  • Springμ—μ„œλŠ” @RestController λ˜λŠ” @ResponseBody μ• λ„ˆν…Œμ΄μ…˜μ΄ 뢙은 λ©”μ„œλ“œκ°€ 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄, ν•΄λ‹Ή κ°μ²΄λŠ” μžλ™μœΌλ‘œ JSON ν˜•μ‹μœΌλ‘œ λ³€ν™˜λ˜μ–΄ ν΄λΌμ΄μ–ΈνŠΈμ— μ „λ‹¬λ©λ‹ˆλ‹€.
  • Spring은 λ‚΄λΆ€μ μœΌλ‘œ Jacksonμ΄λΌλŠ” 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ Java 객체λ₯Ό JSON으둜 μ§λ ¬ν™”ν•©λ‹ˆλ‹€.
    • 이 κ³Όμ •μ—μ„œ 객체의 getter λ©”μ„œλ“œλ₯Ό 톡해 데이터λ₯Ό μΆ”μΆœν•˜λ € JSON을 μƒμ„±ν•©λ‹ˆλ‹€.

2. Jackson에 μ˜ν•œ 직렬화.

  • Spring BootλŠ” Jackson을 기본으둜 ν¬ν•¨ν•˜κ³  μžˆμ–΄, 좔가적인 μ„€μ • 없이 Java 객체λ₯Ό JSON으둜 λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 객체의 getter λ©”μ„œλ“œλ₯Ό 톡해 객체 λ‚΄λΆ€μ˜ 데이터λ₯Ό μΆ”μΆœν•˜κ³ , 이λ₯Ό JSON으둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, getName() μ΄λΌλŠ” getterκ°€ 있으면, μ΄λŠ” nameμ΄λΌλŠ” ν•„λ“œλ‘œ JSON에 ν¬ν•¨λ©λ‹ˆλ‹€.

2️⃣ μ˜ˆμ‹œ.

1. 객체 클래슀.

public class User {
    private Long id;
    private String name;
    private String email;
    
    // κΈ°λ³Έ μƒμ„±μž
    public User() {}
    
    // Getter와 Setter
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getEmail() {
        return email;
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
}

2. Controller 클래슀.

@RestController
@RequestMapping("/users")
public class UserController {
    
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        // User 객체λ₯Ό μƒμ„±ν•˜κ³  λ°˜ν™˜ (μΌλ°˜μ μœΌλ‘œλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ°€μ Έμ˜΄)
        User user = new User();
        user.setId(id);
        user.setName("Kobe");
        user.setEmail("kobe@example.com");
        
        // 이 κ°μ²΄λŠ” μžλ™μœΌλ‘œ JSON ν˜•μ‹μœΌλ‘œ λ³€ν™˜λ˜μ–΄ ν΄λΌμ΄μ–ΈνŠΈμ— λ°˜ν™˜λ¨.
        return user;
    }
}

3️⃣ λ™μž‘ 원리.

1. ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­.

  • ν΄λΌμ΄μ–ΈνŠΈ /users/1 κ³Ό 같이 μš”μ²­μ„ 보내면, Spring은 ν•΄λ‹Ή κ²½λ‘œμ— λ§€ν•‘λœ getUserById λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

2. Java 객체 λ°˜ν™˜.

  • 이 λ©”μ„œλ“œλŠ” User 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

3. 객체λ₯Ό JSON으둜 λ³€ν™˜.

  • Spring은 @RestController λ˜λŠ” @ResponseBodyλ₯Ό 보고, User 객체λ₯Ό JSON ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
  • μ΄λ•Œ Jackson λΌμ΄λΈŒλŸ¬λ¦¬κ°€ getter λ©”μ„œλ“œλ“€μ„ μ‚¬μš©ν•˜μ—¬ 객체 λ‚΄λΆ€μ˜ 값을 μΆ”μΆœν•˜κ³ , 이λ₯Ό JSON으둜 μ§λ ¬ν™”ν•©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ ν”„λ ˆμž„μ›Œν¬μ˜ 차이점

4. ν΄λΌμ΄μ–ΈνŠΈμ— JSON 응닡.

  • μ§λ ¬ν™”λœ JSON 데이터가 ν΄λΌμ΄μ–ΈνŠΈμ— μ‘λ‹΅μœΌλ‘œ μ „μ†‘λ©λ‹ˆλ‹€.

결과둜 ν΄λΌμ΄μ–ΈνŠΈκ°€ λ°›λŠ” JSON

{
    "id": 1,
    "name": "Kobe",
    "email": "kobe@example.com"
}

4️⃣ 주의 사항.

  • 객체에 getterκ°€ μžˆμ–΄μ•Ό 함.
    • Jackson은 객체의 ν•„λ“œλ₯Ό 직접 μ ‘κ·Όν•˜λŠ” 것이 μ•„λ‹ˆλΌ, 기본적으둜 getter λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€.
    • λ”°λΌμ„œ getter λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • 객체가 null인 경우.
    • 객체가 nullμ΄κ±°λ‚˜, νŠΉμ • ν•„λ“œκ°€ null인 경우 κ·Έ ν•„λ“œλŠ” JSON에 ν¬ν•¨λ˜μ§€ μ•Šκ±°λ‚˜ null둜 ν‘œν˜„λ©λ‹ˆλ‹€.
  • μΆ”κ°€ μ„€μ •.
    • ν•„μš”μ— 따라 Jackson의 직렬화/역직렬화 방식을 μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, ν•„λ“œ 이름을 λ³€κ²½ν•˜κ±°λ‚˜ νŠΉμ • ν•„λ“œλ₯Ό μ œμ™Έν•˜κ³  싢을 λ•ŒλŠ” @JsonProperty, @JsonIgnore 같은 Jackson μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5️⃣ μš”μ•½.

  • Java λ°±μ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜λ‘œ κ΅¬ν˜„ν•œ ν›„ Controllerμ—μ„œ getterκ°€ μžˆλŠ” 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄, Spring은 ν•΄λ‹Ή 객체λ₯Ό μžλ™μœΌλ‘œ JSON ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ— μ‘λ‹΅ν•©λ‹ˆλ‹€.
  • μ΄λŠ” 기본적으둜 Spring의 Jackson 라이브러리λ₯Ό 톡해 이루어지며, 좔가적인 μ„€μ • 없이도 객체의 getterλ₯Ό 톡해 JSON으둜 μ§λ ¬ν™”λ©λ‹ˆλ‹€.