Annotation
자바Annotaion(@)은 다른 프로그램에 유용한 정보를 제공하는 주석과 같은 의미 가지는 기능
예외처리
try
예외 발생 가능성이 있는 코드를 감싸고, 예외 발생 시 프로그램 흐름 제어
throw
특정 상황에서 개발자가 의도적으로 예외를 발생시킴
메서드 이름 몰라도Router
가 경로에 맞는 메서드를 찾아 실행
path
값이 경로에 해당하는 메서드 찾아 호출
Method
클래스와invoke()
메서드를 사용해 메서드 동적 호출
예시 코드
package ex02;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Router router = new Router(new UserController()); // 객체 생성
Scanner sc = new Scanner(System.in);
String path = sc.nextLine();
router.routing(path);
}
}
1차 개발자 작성 코드:RequestMapping
,Router
package ex02;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) // 메서드 위에만 사용
@Retention(RetentionPolicy.RUNTIME) // 언제까지? -런타임까지
public @interface RequestMapping { // RequestMapping -어노테이션 이름
String value(); // 키값이 value인 메서드
}
package ex02;
import java.lang.reflect.Method;
public class Router {
UserController uc;
public Router(UserController uc) {
this.uc = uc;
}
// path값 -App에서 사용자가 입력
public void routing(String path) {
// 1. 메서드 찾기
Method[] methods = uc.getClass().getMethods(); // 캡슐화 -모든 메서드를 리턴
// 2. 어노테이션 체크
// 무엇을 하는지 이해 -'어노테이션 찾는 방법'
for(Method m : methods) {
RequestMapping rm = m.getAnnotation(RequestMapping.class); // 메서드에 어노테이션 있는지 확인
// 3. value와 path 일치 확인해서 일치하면 invoke 하기
if(rm == null) break; // 없으면 종료
if (rm.value().equals(path)) {
try {
// 동일하면 invoke(호출) -메서드 이름 몰라도 호출 가능
m.invoke(uc);
} catch (Exception e) {
throw new RuntimeException("메서드 실행중 오류 발생");
}
}
}
}
}
2차 개발자 작성 코드:UserController Router
을 보고 작성
package ex02;
publicass UserController {
@RequestMapping("/login")
public void login() {
System.out.println("로그인");
}
@RequestMapping("/join")
public void join() {
System.out.println("회원가입");
}
@RequestMapping("/logout")
public void logout() {
System.out.println("로그아웃");
}
@RequestMapping("/userinfo")
public void userinfo() {
System.out.println("유저정보");
}
}
@RestController
@Controller
와@ResponseBody
를 결합한 어노테이션
@Controller
요청을 처리하는 일반적인 컨트롤러@ResponseBody
메서드의 반환 값을 HTTP 응답 본문(body)에 매핑
@RestController
가 붙은 클래스 내의 메서드는 뷰를 반환하는 대신 데이터를 반환하며, 반환 데이터는 JSON 형식으로 변환예시 코드
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/home")
public String home() {
// RestController 요청되는 값 그대로 응답
return "<h1>Hello World</h1>";
}
}
출력

Share article