문득 @Controller
와 @RestController
의 차이를 정확히 알고 있나?라는 생각이 들어 찾아보게 되었다.
@RestController
=@Controller
+@ResponseBody
@Controller
: 컨트롤러가 viewName을 반환하면, viewResolver가 그에 해당하는 뷰를 찾는다.
@RestController
: 컨트롤러가 데이터를 반환하면, viewResolver 말고 Converter가 동작한다. 클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 Converter가 선택된다. 데이터를 해당하는 타입(ex. string, json..)으로 Serialize 해준다.
참고한 글 : [Spring] @Controller와 @RestController 차이
jar
파일로 빌드하는 걸 해보는 이유는 배포할 때 이 jar
파일을 넘기면 된다고만 생각했는데 모그님이 더 자세히 이유를 말해주셔서 그대로 받아 적겠다!
우리가 개발하는 스프링부트 프로젝트를 빌드하면 위와 같은 하나의 jar파일로 압축이 됩니다. ‘배포’를 한다는건 만들어진 jar파일을 내 로컬 컴퓨터가 아닌 서버에 올려서 실행한다는 것입니다.
저 jar파일만 배포하면 스프링부트 프로젝트 전체가 실행 가능한거죠!
./gradlew build를
하면 build
폴더에 libs
가 폴더가 생긴다.
그럼 libs
폴더 안에 있는 jar
파일을 실행하면 된다. (-plain.jar
가 아닌 jar
파일)
java -jar [jar파일명].jar
@GetMapping("api/test")
public String test(){
log.info("test success");
return "test";
}
요청 URL : http://localhost:8080/api/test
@GetMapping("api/name")
public String getName(@RequestParam String name) {
log.info("getName={}", name);
return name;
}
implementation 'org.projectlombok:lombok'
build.gradle
에 lombok
의존성을 추가한다.
Enable annotation processing
을 체크해준다!
lombok
플러그인을 설치해준다.
나는 컴파일 에러가 발생해서
annotationProcessor('org.projectlombok:lombok')
를 추가해줬더니 잘 돌아갔다.
⭐ 로그를 사용하는 이유
System.out.println()
으로 콘솔에 찍어도 되지만,
log
를 사용하면 스레드 정보나 클래스 이름 같은 부가 정보를 함계 볼 수 있고 출력모양을 조정할 수 있다. 그리고 로그레벨에 맞게 개발 서버에는 모든 로그를 출력하고, 운영서버에서는 출력하지 않게 할 수 있다.성능도 System.out.println()
보다 좋고, 콘솔 뿐만 아니라 따로 파일에 저장할 수 있다.
우리는 로그 라이브러리를 중에서 Slf4j
를 쓴 것이다. (lombok
으로 편리하게 사용함!)
참고로 로그 레벨은 다음과 같다.
TRACE > DEBUG > INFO > WARN > ERROR > FATAL
INFO
로 셋팅하면, INFO
, WARN
, ERROR
, FATAL
은 기록된다.
FATAL
: 아주 심각한 에러가 발생한 상태를 나타낸다.
ERROR
: 어떠한 요청을 처리하는 중 문제가 발생한 상태를 나타낸다. 프로그램 동작에 큰 문제가 발생했다는 것으로 즉시 문제를 조사해야 하는 것 (DB를 사용할 수 없는 상태, 중요 에러가 나오는 상황)
WARN
: 프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타낸다. WARN에서도 2가지의 부분에선 종료가 일어남
명확한 문제 : 현재 데이터를 사용 불가, 캐시값 사용 등
잠재적 문제 : 개발 모드로 프로그램 시작, 관리자 콘솔 비밀번호가 보호되지 않고 접속 등
INFO
: 어떠한 상태 변경과 같은 정보성 메시지를 나타낸다.
DEBUG
: 개발시 디버그 용도로 사용하는 메시지를 나타낸다.
TRACE
: 디버그 레벨이 너무 광범위한 것을 해결하기 위해서 좀 더 상세한 이벤트를 나타낸다.
출처 : [Web] Logging Level(로그 레벨) 이란?