
2024.2.19 1μΌμ°¨ κ³Όμ
μ§λ¬Έμ λ€μκ³Ό κ°λ€.
- μ΄λ Έν μ΄μ μ μ¬μ©νλ μ΄μ (ν¨κ³Ό) λ 무μμΌκΉ?
- λλ§μ μ΄λ Έν μ΄μ μ μ΄λ»κ² λ§λ€ μ μμκΉ?
λ©νλ°μ΄ν° μ 곡: μ΄λ Έν μ΄μ μ μ½λμ λ©νλ°μ΄ν°λ₯Ό μΆκ°ν μ μλ€. μ΄λ₯Ό ν΅ν΄ μ»΄νμΌλ¬λ λ°νμ νκ²½μ΄ νλ‘κ·Έλ¨μ λμμ μ΄ν΄νκ³ μ²λ¦¬ν μ μκ² λλ€.
μ½λ κ°λ μ± ν₯μ: μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ μ½λμ μλλ₯Ό λͺ ννκ² ννν μ μλ€. μλ₯Ό λ€μ΄, @Override μ΄λ Έν μ΄μ μ λ©μλκ° λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μ€λ²λΌμ΄λ©νλ€λ κ²μ λͺ μμ μΌλ‘ λνλΈλ€.
λ°λ³΅μ μΈ μμ κ°μ: μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ νλ μμν¬λ λΌμ΄λΈλ¬λ¦¬μμ μμ£Ό μ¬μ©λλ ν¨ν΄μ κ°κ²°νκ² ννν μ μλ€. μλ₯Ό λ€μ΄, μ€νλ§ νλ μμν¬μμ @Autowired μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ μμ‘΄μ± μ£Όμ μ κ°λ¨νκ² μ²λ¦¬ν μ μλ€.
μ½λ κ²μ¦ λ° κ²μ¬: μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ μ½λλ₯Ό κ²μ¦νκ³ κ²μ¬ν μ μλ€. μλ₯Ό λ€μ΄, @NotNull μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ λ©μλ λ§€κ°λ³μλ νλμ null κ°μ νμ©νμ§ μλλ‘ κ°μ ν μ μλ€.
λ°νμ μ²λ¦¬ λ° λμ μ μ΄: μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ λ°νμ μμ λμ μΌλ‘ μ²λ¦¬λ₯Ό μνν μ μλ€. μλ₯Ό λ€μ΄, μ€νλ§μ @Transactional μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ λ©μλμ νΈλμμ μ μ μ©ν μ μλ€.
νλ μμν¬ ν΅ν©: μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ λ€μν νλ μμν¬μ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν©ν μ μλ€. μλ₯Ό λ€μ΄, JPA(Java Persistence API)μμλ μν°ν° ν΄λμ€μ @Entity μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈκ³Ό λ§€νν μ μλ€.
λλ μ½λ¦°μ΄λΌμ μ΄λ Έν μ΄μ μ μ’ λ₯λ³λ‘ μμ§λ λͺ»νκ³ ,
μ€μ΅μμ λ€λ€λ RestController, GetMapping , PostMapping , RequestBody μ΄ λ€ κ°μ§ μ΄λ Έν μ΄μ μ μν μ 보μ.
1) @RestController
: κ°λ¨ν λ§ν΄μ μ΄ μ΄λ Έν μ΄μ μ΄ λΆμ ν΄λμ€κ° 컨νΈλ‘€λ¬μ μν μ νλ€κ³ λͺ μνλκ±°λ€.( μ¬μ€ κ·Έλ₯ controllerνκ³ λ λ λ€λ₯΄λ€. jsonλ°μ΄ν°λ₯Ό 리ν΄νλ€λκ² μ°¨μ΄μ μ)
κ°κ°μ 컨νΈλ‘€λ¬λ URLκ²½λ‘μ λ°λΌ HTTPμμ²μ μ²λ¦¬νλλ°, μλ₯Ό λ€μ΄ μλμ UserController ν΄λμ€λ μ μ μ 보μ κ΄λ ¨ν μμ²μ μ²λ¦¬νλ μν μ νλ€.
λ§μ½ RestController μ΄λ Έν μ΄μ μ λΆμ΄μ§ μμΌλ©΄, μμ²μ μ²λ¦¬ν ν΄λμ€λ₯Ό μΌμΌν μ 체λ₯Ό λ€ μ½μ΄λ³΄κ³ μ°Ύμλ΄μΌ ν κ±°λ€.
2) @GetMapping & @PostMapping
: μ΄ λ κ°λ κ°μ΄ 보면 μ’μκ±° κ°λ€. mapping(λ§€ν)μ μ΄λ€ λ κ°λ₯Ό μ°κ²°μμΌμ€λ μ¬μ©νλ λ¨μ΄λ€.
HTTP λ©μλμλ λ€μνκ² μμ§λ§, κ·Έ μ€ λ°μ΄ν°λ₯Ό κ°μ Έμ€λΌλ μμ²μΈ GET κ³Ό, λ°μ΄ν°λ₯Ό μ μ₯νλΌλ μμ²μΈ POSTκ° μλ€.
κ²°κ΅ μ΄ μ΄λ Έν μ΄μ λ€μ GETλ©μλκ° μμ²λμΌλ©΄ μ΄ ν¨μλ₯Ό μ€ννκ³ , POSTλ©μλκ° μμ²λμΌλ©΄ μ΄ ν¨μλ₯Ό μ€νν΄λΌ!=> μλ κ² λ©μλλ³ ν¨μλ₯Ό λ§€νμμΌμ£Όλ μν μ νλ€.
3) @RequestBody
: λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μλ건, ν¬κ² 쿼리μ λ°λκ° μλ€.
URLμμ λ°μ΄ν° μ΄λ¦κ³Ό κ°μ΄ μ λ¬λλ κ²½μ° μΏΌλ¦¬λ₯Ό ν΅ν΄ κ°μ Έμ€κ³ @RequestParam μ΄λ Έν μ΄μ μ μ¬μ©νλ€λ©΄
POSTλ PUTλ°©μμΌλ‘ λ°λλ₯Ό ν΅ν΄ κ°μ²΄μ κ°μΈμ Έμ λ°μ΄ν°κ° μ μ‘λ λλ
@RequestBodyλ₯Ό μ¬μ©νλ©΄ λλ€.
@RestController
public class UserController {
private final List<User> users = new ArrayList<>();
@PostMapping("/user")
public void saveUserInfo(@RequestBody SaveUserRequest request){
users.add(new User(request.getName(),request.getAge()));
}
@GetMapping("/user")
public List<UserResponse> getUsers(){
List<UserResponse> responses = new ArrayList<>();
for (int i=0;i< users.size();i++){
responses.add(new UserResponse(i+1, users.get(i).getName(), users.get(i).getAge()));
}
return responses;
}
}
λ‘κΉ μ μν μ΄λ Έν μ΄μ μ λ§λ€μ΄λ³΄μ.
import java.lang.annotation.*;
// μ΄λ
Έν
μ΄μ
μ μ
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {
String value() default "INFO";
}
// Logger ν΄λμ€
class Logger {
public void log(String level, String message) {
System.out.println("[" + level + "] " + message);
}
}
// μλΉμ€ ν΄λμ€
class MyService {
private Logger logger = new Logger();
@Log("DEBUG")
public void operation1() {
logger.log("DEBUG", "Operation 1 executed");
}
@Log("INFO")
public void operation2() {
logger.log("INFO", "Operation 2 executed");
}
@Log("ERROR")
public void operation3() {
logger.log("ERROR", "Operation 3 executed");
}
}
public class Main {
public static void main(String[] args) {
MyService service = new MyService();
service.operation1();
service.operation2();
service.operation3();
}
}
μ μ½λλ κ° λ©μλμ @Log μ΄λ Έν μ΄μ μ μ μ©νκ³ , ν΄λΉ μ΄λ Έν μ΄μ μ κ°μ λ°λΌ λ‘κ·Έ λ 벨μ κ²°μ νμ¬ μΆλ ₯νλ€.
1. @Log μ΄λ Έν μ΄μ μ μ:
@Retention(RetentionPolicy.RUNTIME): μ΄ μ΄λ
Έν
μ΄μ
μ μ€ν μμλ μ μ§νλλ‘ μ§μ .
@Target(ElementType.METHOD): μ΄ μ΄λ
Έν
μ΄μ
μ λ©μλμ μ μ©ν μ μλλ‘ μ§μ .
String value() default "INFO";: μ΄λ
Έν
μ΄μ
κ°μΌλ‘ μ¬μ©λ λ‘κ·Έ λ 벨μ μ€μ νλ μμ±μ
λλ€. κΈ°λ³Έκ°μ "INFO".
2. Logger ν΄λμ€:
log(String level, String message): λ‘κ·Έ λ 벨과 λ©μμ§λ₯Ό λ°μμ ν΄λΉ λ΄μ©μ μΆλ ₯νλ λ©μλ.
3. MyService ν΄λμ€:
operation1(), operation2(), operation3(): κ°κ°μ λ©μλλ μλΉμ€μ μμ μ λνλ΄λ©°, Loggerλ₯Ό μ¬μ©νμ¬ ν΄λΉ μμ μ΄ μ€νλ λ λ‘κ·Έλ₯Ό μΆλ ₯. κ° λ©μλμλ @Log μ΄λ Έν μ΄μ μ΄ μ μ©λμ΄ μλ€. μ΄λ₯Ό ν΅ν΄ κ° λ©μλμ λ‘κ·Έ λ 벨μ μ§μ ν μ μλ€.
4. Main ν΄λμ€:
main(String[] args): νλ‘κ·Έλ¨μ μ§μ
μ . MyService μΈμ€ν΄μ€λ₯Ό μμ±νκ³ κ° λ©μλλ₯Ό νΈμΆνμ¬ μλΉμ€ μμ
μ μ€ν.