실습
[Spring Settings]
Project : Gradle - Groovy
Language : Java
Spring Boot : 2.7.6
Group : hello
Artifact : springmvc
Name : springmvc
Description : Demo project for Spring Boot
Package Name : hello.springmvc
Packaging : Jar
Java : 11
Dependencies: Spring Web, Thymeleaf, Lombok
GENERATE 수행
war vs jar
war를 사용하는 경우
- jsp 사용할 때
- Tomcat 같은 WAS 서버를 별도로 설치두고 거기에 빌드된 파일을 넣을 때 (내장 Tomcat에도 사용 가능하긴 하지만 주로 외부 서버에 배포하는 목적으로 사용)
jar를 사용하는 경우
- 내장 서버에 최적화 해서 사용하는 경우 ( webapp 경로를 사용하지 않음 )
- 스프링 부트에 packaging을 jar 파일로 설정했을 때 resource/static/ 위치에 index.html 파일을 두면 스프링부트가 index.html을 Welcome 페이지로 처리해준다.
어노테이션, 데이터 받기
@RestController
- @Restcontroller가 설정된 메서드에서 스트링 타입 문자열을 반환하면 문자열 그대로 HTTP body에 담아서 클라이언트에 반환한다.
@Controller
- @Controller가 설정된 메서드에서 스트링 타입 문자열을 반환하면 view 이름으로 인식한다. 그래서 view를 찾고 랜더링 된다.
@Controller 클래스에서
public @Responsebody String 메서드이름() {return "인증완료";}
- Data를 리턴해줄 때
@PathVariable int id
- GET요청 URI 경로의 일부를 파라미터로 사용할 때
@RequestBody User user
- HTTP Body에 담긴 json데이터를 받을 때
@RequestParam int id
- GET 방식으로 넘어온 URI의 queryString을 받을 떄
- @RequestParam은 생략 가능, 생략하면 required =false로 설정돼서 값이 없어도 요청받음. 기본값은 true
User user
- form 태그 요청(x-www-form-urlencoded)으로 넘어온 key=value 데이터를 받을 때
@GetMapping("/auth/kakao/callback")
public @ResponseBody String kakaoCallback() { // @ResponseBody를 붙이면 Data를 리턴해주는 컨트롤러함수가 된다.
return "인증완료";
}
로그
- 스프링부트에서 로그 라이브러리는 보통 spring-boot-starter에 spring-boot-starter-logging에 SLF4J 라이브러리 를 주로 사용한다. slf4j는 인터페이스이고 그 구현체로 Logback 같은 로그 라이브러를 사용한다.
로그 선언
- private Logger log = LoggerFactory.getLogger(getClass());
- private static final Logger log = LoggerFactory.getLogger(Xxx.class)
- @Slf4j : 롬복 사용 가능
로그가 출력되는 포멧
- 시간, 로그 레벨, 프로세스 ID, 쓰레드 명, 클래스명, 로그 메시지
로그 레벨 설정을 변경해서 출력 결과를 보자
- LEVEL: TRACE > DEBUG > INFO > WARN > ERROR
- 개발 서버는 debug 출력
- 운영 서버는 info 출력
로그 레벨 설정
application.properties
#전체 로그 레벨 설정(기본 info)
logging.level.root=info
#hello.springmvc 패키지와 그 하위 로그 레벨 설정 ( src/main/java 하위 경로.. src/main/java/hello/springmvc )
logging.level.hello.springmvc=debug
로그 사용시 장점
- 쓰레드 정보, 클래스 이름 같은 부가 정보를 같이 볼 수 있고 출력 모양 조정 가능
- 로그 레벨 지정 가능 ( 개발 서버에서는 모든 로그 출력, 운영 서버에서는 출력하지 않는 등 상황에 맞게 조절 가능)
- 시스템 콘솔 뿐 아니라 특정 파일, 네트워크 등에 로그를 남길 수 있다. ( 특정 파일에 남길 때는 일별, 특정 용량에 따라 로그 분할도 가능)
- 내부 버퍼링, 멀티 쓰레드가 지원돼서 System.out보다 성능이 좋다.
로그를 이용한 에러 출력
@ControllerAdvice
@RestController
public class GlobalExceptionHandler {
private Logger log = LoggerFactory.getLogger(getClass());
@ExceptionHandler(value = Exception.class)
public ResponseDto<String> handleArgumentException(Exception e) {
log.error("{}",e.getStackTrace());
log.debug("{}",e);
return new ResponseDto<String>(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.toString());
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ResponseDto<T> {
int status;
T data;
}
참고 - [Spring] - e.printStackTrace() 보다 StackTraceElement로 로깅하기 (tistory.com)
tip
- 스프링은 /hello 로 맵핑해놓으면 /hello 와 /hello/ 는 다른 URL이지만 같은 요청으로 본다.
- @RequestMapping으로 Http 메서드를 지정하지 않으면 HTTP메서드와 무관하게 호출된다. ( GET,HEAD,PUT,PATCH,DELETE 모두 허용)
- @RequestMapping에 method를 지정하거나 @GetMapping @PostMapping 과 같이 지정할 수 있다.
HTTP 요청에 대한 여러가지 매핑 방법 ( MVC 1편 - 요청 매핑 )
특정 HTTP method(축약 어노테이션 사용 가능)
경로 변수
경로 변수 다중 사용
파라미터로 추가 매핑
특정 헤더로 추가 매핑
Content-Type 헤더 기반 추가 매핑
Accept 헤더 기반 매핑
'programming study > B-Spring' 카테고리의 다른 글
spring에서 session 사용하기 (0) | 2022.12.23 |
---|---|
@Transactional (0) | 2022.12.22 |
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (1) (0) | 2022.11.22 |
Spring Boot 환경에서 Quartz Scheduler 사용하기 (0) | 2022.11.14 |
spring 기본 요약 (사용 이유, 객체지향, IOC/DI/container, 빈 등록, 의존관계 주입, 스코프 등) (1) | 2022.11.02 |