programming study/B-Spring

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (2)

gu9gu 2022. 12. 12. 18:41

실습

[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 헤더 기반 매핑