War : Tomcat이 외부에 있고 JSP를 사용할 때.
Jar : 내장 톰캣을 사용하고 webapp 경로도 사용 안함.
jar는 /resources/static/index.html
이 Welcome페이지로 처리해준다
운영 시스템에서는 System.out을 사용하지 않는다. == Logging라이브러리를 사용
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
@RestController
public classLogTestContoller {
private final Loggerlog = LoggerFactory.getLogger(LogTestContoller.class);
@RequestMapping("/log-test")
publicString logTest(){
String name = "Spring";
log.info("info-log = {}",name);
return name;
}
}
@RestController
는 문자열이 아닌 값으로 반환한다는 의미@RequestMapping
은 뷰의 이름을 반환하는 것private final Loggerlog
로그 객체 생성 후 slf4j의 구현체를 주입해줘야한다.LoggerFactory.getLogger(LogTestContoller.class)
출력하지 않는 레벨이여도 생성된다
Log는 성능 최적화면에서 sysout에 비해 압도적이다 !!
#hello . springmvc패키지와 하위 로그 레벨 설정
logging.level.hello.springmvc=debug;
logging.level.hello.springmvc=trace;
applicatoin.properties
에서 설정한 레벨 수준으로만 Logger가 출력된다.Log Level
loggin.level.root = INFO
== Default Setting@Slf4j
으로 사용@Slf4j
@RestController
public classLogTestContoller {
//private final Logger log = LoggerFactory.getLogger(LogTestContoller.class);
@RestController()
@RequestMapping( URL패턴 , method )
URL 패턴이 두개가 들어가도 허용된다
두개의 경로 허용
method으로 요청 종류를 고정할 수 있다.
/ hello-basic
/ hello-basic /
두개는 별개의 패턴이지만 Spring은 더미 슬래쉬로 이해해 처리해준다.
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data){
return data;
}
@GetMapping("/mapping/{userId}")
@GetMapping(value = "/mapping-get" , params = "mode=test")
@GetMapping(value = "/mapping-header" , headers = "mode=header")
@GetMapping(value = "/mapping-header" , consumes = "application/json")
consumes
produce
@PostMapping(value = "/mapping-produces" , produces = "text/html")
MediaType으로 미리 구현이 되어있다.
@RestController
public class MappingClassController {
@GetMapping("/mapping/users")
public String user(){return "get users";}
@PostMapping("/mapping/users")
public String addUser(){return "add users";}
@GetMapping("/mapping/users/{userId}")
public String findUser(@PathVariable String userId){return "find users : " + userId;}
@PatchMapping("/mapping/users/{userId}")
public String patchUser(@PathVariable String userId){return "patch users : " + userId;}
@DeleteMapping("/mapping/users/{userId}")
public String deleteUser(@PathVariable String userId){return "delete users : " + userId;}
}
@PatchMapping 등으로 매우 편하게 조회할 수 있다.
필요한 파라미터를 다양한 방식으로 가져올 수 있다.
@RequestMapping("/headers")
public String headers(HttpServletResponse response,
HttpServletRequest request,
HttpMethod httpMethod,
Locale locale,
@RequestHeader MultiValueMap<String,String> headerMap,
@RequestHeader("host") String host,
@CookieValue(value="myCookie", required = false) String cookie
){
log.info("{}",request);
log.info("{}",response);
log.info("{}",httpMethod);
log.info("{}",locale);
log.info("{}",headerMap);
log.info("{}",host);
log.info("{}",cookie);
return "String";
}
MultiValueMap<String,String>
?@CookieValue(value="myCookie", required = false) String cookie
h.s.b.request.RequestHeaderController : org.apache.catalina.connector.RequestFacade@590cdf37
h.s.b.request.RequestHeaderController : org.apache.catalina.connector.ResponseFacade@7844d298
h.s.b.request.RequestHeaderController : DELETE
h.s.b.request.RequestHeaderController : ko_KR
h.s.b.request.RequestHeaderController : {user-agent=[PostmanRuntime/7.29.2], accept=[*/*], postman-token=[7aa5a50d-60cf-4f0c-a66f-c2f338809c56], host=[localhost:8080], accept-encoding=[gzip, deflate, br], connection=[keep-alive]}
h.s.b.request.RequestHeaderController : localhost:8080
h.s.b.request.RequestHeaderController : null
GET 과 POST는 둘 모두 담기는 위치만 다를 분 같은 데이터 형식임으로 구분 없이 조회 할 수 있다.
request.getParameter(”파리미터명”);
------------------------------------------------
--@RequestParam( “ 파라미터 명 “ ) 자료형 변수명
@RequestParam("username") String memberName,
@RequestParam("age") int age
------------------------------------------------
-- @RequestParam 자료형
@RequestParam String username,
@RequestParam int age
------------------------------------------------
-- 자료형 변수명(파라미터명과 동일한 )
String username , *int* age
다만 RequestParam을 완전 생략하는 건 팀의 스프링 숙련도를 고려하는 것이 좋다.
@RequestParam(required = *true)* String username,
@RequestParam(required = *true* , defaultValue = "requi") String username,
@RequestParam *Map*<String,Object> paramMap
@RequestParam *MultiValueMap*<String,Object> paramMap
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
return helloData.toString();
}
@Data
ModelAttribute가 있는 경우
타입이 달라 바인딩이 제대로 안될 경우 예외가 발생한다.
BindException
@ModelAttribute
도 생략이 가능하다
String , int , Integer 와 같은 단순 타입 자료형의 경우
@RequestParam
으로 인식그 외 객체 자료형
@ModelAttribute
으로 인식출처