🌱<μΈν”„λŸ° μ›Œλ°μ—… μŠ€ν„°λ”” 클럽 0κΈ°> BE - 1일차 과제

AishaΒ·2024λ…„ 2μ›” 19일
post-thumbnail

2024.2.19 1일차 과제
μ§ˆλ¬Έμ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” 이유 (효과) λŠ” λ¬΄μ—‡μΌκΉŒ?
  • λ‚˜λ§Œμ˜ μ–΄λ…Έν…Œμ΄μ…˜μ€ μ–΄λ–»κ²Œ λ§Œλ“€ 수 μžˆμ„κΉŒ?

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;

    }


}

2. λ‚˜λ§Œμ˜ μ–΄λ…Έν…Œμ΄μ…˜ λ§Œλ“€κΈ°

λ‘œκΉ…μ„ μœ„ν•œ μ–΄λ…Έν…Œμ΄μ…˜μ„ λ§Œλ“€μ–΄λ³΄μž.

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 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  각 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ„œλΉ„μŠ€ μž‘μ—…μ„ μ‹€ν–‰.

profile
μ΄κ²ƒμ €κ²ƒλ§Œλ“€μ–΄λ³΄κ³ μ‹Άμ–΄μš”!

0개의 λŒ“κΈ€