어노테이션
- 어노테이션(Annotation)은 자바에서 특정 대상(클래스,메서드,변수 등)의 상태나 속성을 부여하기 위해 사용한다.
Spring Boot
- @Autowired (멤버 변수, 생성자) : 해당 멤버 변수나 생성자가 가지고 있는 매개 변수를 스프링 프레임워크가 객체화되어야 한다는 지정이다. 단, 대상은 스프링 프레임워크가 인식할 수 있는 범위 내에 있는 빈(bean)이어야 한다.
- @controller (클래스) : 해당 클래스가 스프링 MVC 패턴의 컨트롤러임을 알린다 // 클래스에만 사용할 수 있는 어노테이션.
- 속성
- value : 해당 컨트롤러의 식별자를 문자열로 지정한다. 생략시 클래스의 이름을 사용한다. // 가끔 겹칠 수 있는 경우 패키지 경로를 풀로 다 적어줌 ( package com.hj.studyspring.controllers. 클래스 이름)
- 속성
- @RequestMapping(클래스,메서드) : 요청을 받아들일 경로 매핑을 지정한다.
- 해당 어노테이션이 클래스에 부여되어 있을 경우 해당 클래스가 가지는 모든 매핑되어 있는 메서드의 매핑 경로에 대한 접두어로 동작한다.
- 해당 어노테이션이 메서드에 부여되어 있을 경우 매핑된 경로로 요청이 발생했을 때 해당 메서드를 실행하게 된다.
- @Controller 혹은 @RestController 어노테이션이 부여된 클래스 스스로 혹은 내부에서 사용되었을때 유효하다.
- 속성
- method : 해당 매핑이 받아들일 요청 방식(HTTP Method)을 RequestMethod(org.springframework.web.bind.annotaion.RequestMethod) 가 가지는 멤버로 지정한다. 별도로 지정하지 않을 경우 모든 방식을 허용한다.
- produces : 해당 매핑에 대한 요청의 응답 결과로 반환될 content.type 을 mediaType ( org.springframework.http.MediaType)이 가지는 멤버로 지정한다. 생략시 프레임워크가 스스로 판단한다. produces는 서버가 클라이언트(브라우저, 앱 등)에 응답할 때 어떤 데이터 타입(Content-Type)으로 보낼지를 지정하는 옵션 @GetMapping(value = "/json", produces = "application/json")
- value 혹은 path : 해당 매핑의 경로를 문자열로 지정한다.
- 속성
//검색어 창에 주소치고 엔터치면 보통 GET방식임
public class UtilsController {
@RequestMapping(value = "/calc" , method = RequestMethod.GET) // 메서드 매핑
public String getCalc(){
System.out.println("GET 실행 완");
return "utils/calc"; //여기서 반환하는 문자열 "utils/calc"가 뷰 이름이에요. 뷰란 우리가 보여주고 싶은 화면(html 파일)이에요.
}
}
public class UtilsController {
@RequestMapping(value = "/calc" , method = RequestMethod.POST) // 메서드 매핑
public String postCalc(){
System.out.println("POST 실행 완");
return "utils/calc"; //여기서 반환하는 문자열 "utils/calc"가 뷰 이름이에요. 뷰란 우리가 보여주고 싶은 화면(html 파일)이에요.
}
}
위처럼 같은 주소에 다른 방식의 메서드가 2개 있는데 주소 + 엔터면 겟방식이라 위에 메서드가 실행됨
- @ResponseBody (메서드) : 해당 메서드의 반환 타입이 문자열 string 일 때, 템플릿을 뷰(view) 처리하는 것이 아닌, 문자열 그대로가 응답으로 반환되어야 함을 지정한다.
- 반환 타입이 문자열일 때 뿐만 아니라 응답 결과가 클라이언트에게 그대로 전달되어야 할 때 해당 어노테이션을 부여한다.
@Controller
@RequestMapping(value="/utils") // 클래스매핑 , 클래스는 요청을 받으면 응답을 줄 수 있는 친구가 아님 대신 이 클래스
//안에 들어있는 메서드가 응답을 줌 getCalc() 메서드 ,클래스 앞에 붙은 ""는 전역적인 역할을 함.
public class UtilsController {
@RequestMapping(value = "/calc") // 메서드 매핑
@ResponseBody
public String getCalc(){
System.out.println("실행 완");
return "utils/calc"; //여기서 반환하는 문자열 "utils/calc"가 뷰 이름이에요. 뷰란 우리가 보여주고 싶은 화면(html 파일)이에요.
}
}
-> return 에서 "utils/calc" 이란 문자열을 그대로 출력 view 가 아닌 string 으로 출력
- @RequestParam(매개 변수) : 클라이언트가 요청과 함께 보낸 데이터를 매개 변수에 할당하기 위해 사용한다.
- 속성
- value : 클라이언트가 전달하는 변수의 이름을 지정한다.
- defaultValue : 클라이언트가 해당 변수를 누락하였을 때 사용할 기본 값을 문자열로 지정한다.
- required : 해당 매개 변수에 할당할 데이터가 반드시 있어야 하는가의 여부를 지정한다. 기본값은 true 이며 true일 때 해당 값을 누락할 경우 400(bad request) 오류가 발생한다.
- 속성
@Controller
@RequestMapping(value="/utils") // 클래스매핑 , 클래스는 요청을 받으면 응답을 줄 수 있는 친구가 아님 대신 이 클래스
//안에 들어있는 메서드가 응답을 줌 getCalc() 메서드 ,클래스 앞에 붙은 ""는 전역적인 역할을 함.
public class UtilsController {
@RequestMapping(value = "/calc") // 메서드 매핑
public String getCalc(@RequestParam(value ="a" ,defaultValue = "0") int a){
System.out.println(a);
return "utils/calc"; //여기서 반환하는 문자열 "utils/calc"가 뷰 이름이에요. 뷰란 우리가 보여주고 싶은 화면(html 파일)이에요.
}
}
@RequestMapping(value = "/calc",method=RequestMethod.POST) // 메서드 매핑
public String postCalc(@RequestParam(value ="a" ,defaultValue = "0") int a,
@RequestParam(value="c",defaultValue = "0") String c,
@RequestParam(value ="b" ,defaultValue = "0")int b){
if(c.equals("+")){
System.out.println("a + b = " +a+b);
}else if(c.equals("-")){
System.out.println("a - b = " + (a-b));
} else if (c.equals("*")) {
System.out.println("a * b = " + (a*b));
} else if (c.equals("/")) {
System.out.println("a / b = " + (a/b));
} else if(c.equals("%")){
System.out.println("a % b = " + (a%b));
}
return "utils/calc"; //여기서 반환하는 문자열 "utils/calc"가 뷰 이름이에요. 뷰란 우리가 보여주고 싶은 화면(html 파일)이에요.
}
switch 문으로도 위에식 표현 가능
double r = switch (c) {
case "+" -> a + b;
case "-" -> a - b;
case "*" -> a * b;
case "/" -> (b == 0) ? Double.NaN : (a / b);
case "%" -> a % b;
default -> Double.NaN; // 정의되지 않은 연산자 → NaN
};
System.out.println("결과: " + r);
return "utils/calc";
- @Service(클래스) : 해당 클래스가 서비스임을 알린다
- 속성
- value :
HTML <form> 태그는 기본적으로 요청방식이 get이라서 post 로 하고 싶으면 html 에 form태그에 method=post 를 추가해줘야 함
<form method="post">

숫자를 넣고 계산하기 버튼을 누르면 화면에 결과값이 나올 수 있도록 만들기.
<body>
<form method="post" id="form">
<input id="number1" name="a" type="number">
<select id="operator" name="c">
<option value="+">+</option>
<option value="-">-</option>
<option value="/">/</option>
<option value="*">*</option>
<option value="%">%</option>
</select>
<input id="number2" name="b" type="number">
<button id="btn" type="submit">계산하기</button>
</form>
<div id="result" class="result">
[계산하기] 버튼을 클릭해 주세요.
</div>
</body>
js
const result = document.getElementById('result') //화면에 출력하는 결과용
const form = document.getElementById('form'); // 숫자를 입력받는 폼
form.addEventListener('submit',(e)=>{
e.preventDefault();
const xhr = new XMLHttpRequest();
const formData = new FormData(form);
// 폼데이터 객체에 해당 인자들을 가지고 옴(name으로)
const a= formData.get('a');
const b= formData.get('b');
const op= formData.get('c');
xhr.open('POST','/utils/calc-api')
xhr.onload = function() {
if(xhr.status === 200){
result.innerText = `${a} ${op} ${b} = ${xhr.responseText}`; // 화면에 결과 출력
} else {
result.innerText = "서버 오류: " + xhr.status;
}
};
xhr.send(formData); // FormData 보내기
});
@RequestBody를 붙이는 이유.
안 붙이면 html 코드 전체를 반환함
@Controller
@RequestMapping(value="/utils") // 클래스매핑 , 클래스는 요청을 받으면 응답을 줄 수 있는 친구가 아님 대신 이 클래스
//안에 들어있는 메서드가 응답을 줌 getCalc() 메서드 ,클래스 앞에 붙은 ""는 전역적인 역할을 함.
public class UtilsController {
@RequestMapping(value = "/calc",method = RequestMethod.GET) // 메서드 매핑
public String getCalc(){
System.out.println("getCalc 실행됨");
return "utils/calc"; //여기서 반환하는 문자열 "utils/calc"가 뷰 이름이에요. 뷰란 우리가 보여주고 싶은 화면(html 파일)이에요.
}
@RequestMapping(value = "/calc-api",method=RequestMethod.POST) // 메서드 매핑
@ResponseBody
public Double postCalc(@RequestParam(value ="a" ,defaultValue = "0") Double a,
@RequestParam(value="c",defaultValue = "0") String c,
@RequestParam(value ="b" ,defaultValue = "0")Double b){
return switch (c) {
case "+" -> a + b;
case "-" -> a - b;
case "*" -> a * b;
case "/" -> (b == 0) ? Double.NaN : (a / b);
case "%" -> a % b;
default -> Double.NaN; // 정의되지 않은 연산자 → NaN
};
}
}

'BACK-END > SPRING' 카테고리의 다른 글
| Spring | 2025-12-01 (0) | 2025.12.01 |
|---|