스프링 MVC - 기본기능

최주영·2024년 2월 7일
0

✅ JAR , WAR 차이

  • JAR -> 내장 서버 사용에 최적화 되어 있는 기능
  • WAR -> 내장 서버도 가능하지만, 주로 외부 서버에 배포하는 목적으로 사용

JAR (Java Archive)

  • JAVA 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일
  • Class (JAVA리소스, 속성 파일), 라이브러리 파일을 포함함
  • JRE(JAVA Runtime Environment)만 있어도 실행 가능함 (java -jar 프로젝트네임.jar)
  • ex) 스프링부트

WAR (Web Application Archive)

  • Servlet / Jsp 컨테이너에 배치할 수 있는 웹 애플리케이션(Web Application) 압축파일 포맷
  • 웹 관련 자원을 포함함 (JSP, Servlet, JAR, Class, XML, HTML, Javascript)
  • 사전 정의된 구조를 사용함 (WEB-INF, META-INF)
  • 별도의 웹서버(WEB) or 웹 컨테이너(WAS) 필요
  • 즉, JAR파일의 일종으로 웹 애플리케이션 전체를 패키징 하기 위한 JAR 파일이다.

Controller , RestController 차이

  • Controller은 View를 반환할 때 사용
  • RestController = @Controller + @ResponseBody
    -> HTTP 메시지 바디에 바로 입력, JSON 형태로 객체 데이터를 반환할 때 주로 사용
@Controller 일때 -> return "ok" 일 경우 -> ok라는 view 화면을 찾음
@RestController 일때 -> return "ok" 일 경우 -> 해당 문자열을 반환

✅ 로그 출력

  • LEVEL : TRACE > DEBUG > INFO > WARN > ERROR
  • 개발서버는 debug 출력, 운영서버는 info 출력
  • 해당 레벨부터 하위 레벨까지 출력함
    ex) 경로 : application.properties
    logging.level.root = info -> 모든 경로에서 사용하는 로그들은 info, warn, error만 출력
    logging.level.hello.springmvc= warn -> 패당 경로에서 사용하는 로그들은 warn, error만 출력

로그 사용 예시

@Slf4j // Slf4j 어노테이션을 사용하면 밑에처럼 log 변수를 생성하지 않아도 알아서 코드가 삽입됨
@RestController 
public class LogTestController {
//    private final Logger log = LoggerFactory.getLogger(getClass());

    @RequestMapping("/log-test")
    public String logTest(){
        String name = "Spring";

        System.out.println("name = " + name);
        log.trace("trace log={}",name);
        log.debug("debug log={}",name);
        log.info(" info log={}",name);
        log.warn(" warn log={}",name);
        log.error(" error log={}",name);

        return "ok";
    }
}

로그 사용시 장점

  • 쓰레드 정보, 클래스 이름 등 부가 정보를 같이 볼 수 있고, 출력 모양을 조정 가능
  • 개발 환경에 따라서 상황에 맞게 조정 가능
  • 성능(내부 버퍼링, 멀티 쓰레드 등)이 System.out 보다 더 좋음

✅ 경로 변수 사용

@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long
orderId) {
 log.info("mappingPath userId={}, orderId={}", userId, orderId);
 return "ok";
}

✅ 미디어 타입

  • 받고싶은 데이터를 강제함으로 써 오류사항 줄이기 가능
  • consumes -> 들어오는 데이터 타입을 정의할 때 사용
  • (클라이언트가 서버에게 보내는 데이터 타입 명시)
@PostMapping(value = "/mapping-consume", consumes = "application/json")
// uri를 호출하는 쪽에서 헤더에 보내는 데이터가 json 이라는 것을 명시해야함
public String mappingConsumes() {
 log.info("mappingConsumes");
 return "ok";
}
  • Accept -> 반환하는 데이터 타입을 정의할 때 사용
  • (서버가 클라이언트에게 반환하는 데이터 타입 명시)
@PostMapping(value = "/mapping-produce", produces = "text/html")
// text/html 타입만 받아들일 수 있음
public String mappingProduces() {
 log.info("mappingProduces");
 return "ok";
}

✅ HTTP 요청 - 기본, 헤더 조회

@Slf4j
@RestController
public class RequestHeaderController {
    @RequestMapping("/headers")
    public String headers(HttpServletRequest request,
                          HttpServletResponse response,
                          HttpMethod httpMethod, // 메소드 방식
                          Locale locale,  // 요청지역?
                          @RequestHeader MultiValueMap<String,String> headerMap,
                          // Http 쿼리 파라미터와 같이 하나의 키에 여러값을 받을 때 사용
                          // Ex) keyA=value1&keyA=value2   하나의 키 : keyA    여러값 : value1,value2
                          @RequestHeader("host") String host, // 하나의 헤더 받을 때
                          @CookieValue(value = "myCookie", required = false) String cookie // 쿠기값
                          ){
        log.info("request={}", request);
        log.info("response={}", response);
        log.info("httpMethod={}", httpMethod);
        log.info("locale={}", locale);
        log.info("headerMap={}", headerMap);
        log.info("header host={}", host);
        log.info("myCookie={}", cookie);
        return "ok";
    }
}

profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글