본문 바로가기
반응형

Framework & Library176

[Spring Boot] : 프로젝트 생성 및 요구사항 분석 https://start.spring.io/ 위 사이트에서 Spring 프로젝트를 생성해 주었다. 이번 강의 섹션에서는 요구사항 분석을 통해 상품을 관리할 수 있는 서비스를 만들어 본다. 상품 도메인 모델은 상품ID, 상품명, 가격, 수량이고 상품 관리 기능은 상품 목록, 상품 상세, 상품 등록, 상품 수정이 있다. 상품 상세는 자세히 볼 수 있는 페이지, 등록은 상품을 등록하고 목록은 등록한 상품들이 보여지는 페이지이다. 강사님이 현업에서 일 하는 방법에 대해 설명해 주셨다. 요구사항이 정리되면 디자이너, 웹 퍼블리셔, 백엔드 개발자가 일은 나눠 진행하고 디자이너가 요구사항에 맞게 디자인하고 웹 퍼블리셔는 HTML, CSS를 만들어 개발자에게 제공한다. 백엔드 개발자는 웹 퍼블리셔를 통해 HTML 화면.. 2022. 2. 1.
[Spring Boot] : 요청 매핑 핸들러 어뎁터 구조 [출처]springmvc1 강의 자료/178페이지 강의에서 제공하는 그림에서 HTTP 메시지 컨버터의 위치가 보이지 않는다. 이 부분에 대해서 진도를 나갔다. 강사님이 모든 비밀은 @RequestMapping을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter에 있다고 했다. RequestMappingHandlerAdapter 동작 방식이다. RequestMapping(핸들러 어댑터)가 ArgumentResolver에게 필요한 객체를 가져와 달라고 요청하고 ArgumentResolver는 객체를 가져다 준다. 이렇게 객체를 다 만들고 RequestMapping은 핸들러(컨트롤러)를 호출하게 되고 호출을 하면서 핸들러가 필요로하는 파라미터를 ArgumentResolver가 전달해.. 2022. 1. 28.
[Spring Boot] : HTTP 메시지 컨버터 뷰 템플릿을 통해 HTML을 생성해서 응답하는 게 아니라, HTTP API 처럼 JSON 데이터를 HTTP 메시지 바디에서 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 사용하면 편하다고 한다. 강의에서 HTTP 메시지 컨버터를 자세하기 알아보기 전에 @ResponseBody에 대해서 간단하게 설명을 해 주었다. 내용은 아래와 같다. @ResponseBody를 사용하면 HTTP의 Body에 문자 내용을 직접 반환한다. 즉, ViewResolver 대신에 HttpMessageConverter가 동작하게 되는 것이다. HTTP 메시지 컨버터는 인터페이스로 되어 있다. HTTP 메시지 컨버터는 HTTP 요청, HTTP 응답 둘 다 사용된다. HttpMessageConverter 인터페이스에 들어가 보면 ca.. 2022. 1. 28.
[Spring Boot] : HTTP, API 메시지 바디에 직접 입력해 HTTP 응답하기 HTTP API를 제공하는 경우 데이터를 전달해야 하므로 JSON 형식으로 데이터를 전달한다. @Slf4j @RestController 먼저 컨트롤러는 @RestController를 사용했다. @RestController를 사용하면 해당 컨트롤러에 모두 @ResponseBody가 적용이 되며 이름 그대로 Rest API(HTTP API)를 만들 때 사용되는 컨트롤러이다. 즉, @RestController를 사용하면 안에 @ResponseBody가 적용되어 있어서 따로 선언을 하지 않아도 된다. @GetMapping("/response-body-string-v1") public void responseBodyV1(HttpServletResponse response) throws IOException { r.. 2022. 1. 28.
[Spring Boot] : 정적 리소스 및 뷰 템플릿 스프링 서버에서 응답 데이터를 받는 방법은 크게 3가지 정도로 나누어진다. 정적 리소스 HTML, CSS, JS 뷰 템플릿 사용 웹 브라우저에 동적인 HTML을 제공할 때 뷰 템플릿을 사용한다. HTTP 메시지 사용 HTTP API를 제공하는 경우에 HTML이 아니라 데이터를 전달해야 한다. 떄문에 HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다. Spring Boot는 /static, /public, /resources, /META-INF/resources 디렉토리에 있는 정적 리소스를 제공한다. src/main/resources는 리소스를 보관하는 곳이면서 클래스 패스의 시작 경로이다. 이 디렉토리에 리소스를 넣어두면 스프링 부트가 정적 리소스로 서비스를 제공하게 된다. /src/.. 2022. 1. 26.
[Spring Boot] : HTTP 요청 메시지 JSON HTTP API에서 주로 사용하는 JSON 데이터 형식을 조회한다. @PostMapping("/request-body-json-v1") public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException { ServletInputStream inputStream = request.getInputStream(); String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); log.info("messageBody={}", messageBody); HelloData helloData = objectM.. 2022. 1. 26.
[Spring Boot] : HTTP 요청 메시지 - 단순 텍스트 관련 알아보기 HTTP message body에 직접 데이터를 담아 요청하는데 HTTP message body의 데이터를 InputStream을 사용해 직접 읽을 수 있다. 요청 파라미터와 달리 HTTP message body를 통해 데이터가 넘어 오는 경우엔 @RequestParam, @ModelAttribute를 사용할 수 없다. @PostMapping("/request-body-string-v2") public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException { String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.U.. 2022. 1. 26.
[Spring Boot] : HTTP 요청 파라미터 - @ModelAttribute 실제 개발을 할 떄 요청 파라미터를 받아 객체를 만들고 값을 넣어줘야 하는데 이 과정에서 스프링이 자동화로 지원해주는 기능이 있다. 이 기능에 대해서 알아본다. import lombok.Data; @Data public class HelloData { private String username; private int age; } 먼저 요청 파라미터를 바인딩 받을 객체를 만들었다. lombok 라이브러리를 통해 @Data 어노테이션을 사용했다. @ResponseBody @RequestMapping("/model-attribute-v1") public String modelAttributeV1(@ModelAttribute HelloData helloData) { log.info("username={}, ag.. 2022. 1. 25.
[Spring Boot] : HTTP 요청 파라미터 - @RequestParam @RequestParam을 사용하면 요청 파라미터를 매우 편리하게 사용이 가능하다. @RequestParam은 스프링이 제공한다. @ResponseBody @RequestMapping("/request-param-v2") public String requestParamV2( @RequestParam("username") String memberName, @RequestParam("age") int memberAge) { log.info("username={}, age={}", memberName, memberAge); return "ok"; } 한 번에 많은 어노테이션이 보이는데 정리를 해보면 @ResponseBody는 View 조회를 무시하고 HTTP message body에 직접 해당 내용을 입력하고.. 2022. 1. 25.
[Spring Boot] : HTTP 요청 파라미터 , 쿼리 파리미터, HTML Form 저번에 강의에서 서블릿으로 진행한 HTTP 요청 데이터 조회를 스프링으로 만들어 본다. 클라이언트에서 서버로 요청 데이터를 전달할 때 3가지 방법이 주로 사용되는데 GET 쿼리 파라미터 POST - HTML Form HTTP message body 이 세 가지가 주로 사용 된다고 한다. @RequestMapping("/request-param-v1") public void rquestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException { String username = request.getParameter("username"); int age = Integer.parseInt(request.getParam.. 2022. 1. 25.
[Spring Boot] : HTTP 요청 기본, 헤더 조회 어노테이션 기반 스프링 컨트롤러는 다양한 파라미터를 지원하는데 이번에는 HTTP 헤더 정보를 조회하는 방법을 알아본다. @Slf4j @RestController public class RequestHeaderController { @RequestMapping("/headers") public String headers( HttpServletRequest request, HttpServletResponse response, HttpMethod httpMethod, Locale locale, @RequestHeader MultiValueMap headerMap, @RequestHeader("host") String host, @CookieValue(value = "myCookie", required = fa.. 2022. 1. 25.
[Spring Boot] : 요청 매핑 API 예시 @RestController @RequestMapping("/mapping/users") public class MappingClassController { @GetMapping public String user() { return "get users"; } @GetMapping("/{userId}") public String findUser(@PathVariable String userId) { return "get userId=" + userId; } } @RequestMapping을 클래스 레벨에 매핑 정보를 두면 메서드 레벨에서 해당 정보를 조합해서 사용한다. 위에 GetMapping은 경로가 /mapping/users인 것이고 아래 findUser 메서드의 GetMapping의 경로는 /mapp.. 2022. 1. 25.
[Spring Boot] : @RequestMapping, 요청 매핑 종류 및 사용법 @RestController public class MappingController { private Logger log = LoggerFactory.getLogger(getClass()); @RequestMapping("/hello-basic") public String helloBasic() { log.info("helloBasic"); return "ok"; } } @RestController는 반환 값으로 뷰를 찾는 것이 아니라 HTTP 메시지 바디에 바로 입력한다고 한다. 따라서 실행 결과를 바로 OK로 받을 수 있다. @RequestMapping(”/hello-basic”)은 /hello-basic URL 호출이 오면 이 메서드가 실행이 되도록 한다. 배열을 통해 다중 설정도 가능하다. @Ge.. 2022. 1. 25.
[Spring Boot] : Spring Boot Log 사용하기 , Lombok 라이브러리 로그 강사님이 보너스로 로깅에 관해서도 알려주셨다. 팀 프로젝트 할 때 log4j를 통해 print문을 대신해서 로그를 찍었는데 역시 왜 찍는지, print와 뭐가 다른지 모르고 그냥 사용만 하고 있었는데 이번 강의를 통해 조금으 더 알게 되었다. 강사님이 이번 강의에서도 깊게는 다루지 않고 간단하게만 알아본다고 하셨다. 조금 더 깊게 사용하면 어떻게 사용할 수 있는지도 따로 찾아봐야 할 것 같다. 우선, 따로 찾아본 바로는 로그와 print문의 차이로는 print는 바로 출력이 되고 따로 찾아 볼 수는 없지만 log를 찍게 되면 나중에 log 파일을 뒤져 그동안 찍힌 log를 찾아 볼 수 있다고 한다. 이게 아직 활용은 해본 적은 없지만 작년에 학교 수업을 들으면서 Hadoop을 사용할 때 로그 파일을 모아.. 2022. 1. 25.
[SpringBoot] : Spring Boot Jar 프로젝트 생성 스프링 프로젝트를 생성해 주었다. 여기←에서 생성을 했다. 간단하게 설정을 하고 프로젝트를 다운로드 받을 수 있다. 이번에는 War가 아니라 Jar을 선택했다. JSP를 사용하지 않기 때문에 Jar를 사용하는 게 더 좋다. Spring Boot를 사용하면 이 방식을 주로 사용한다. Jar를 사용하면 내장 서버를 사용하게 webapp 경로도 따로 사용하지 않는다. 즉, 내장 서버 사용에 최적화가 되어 있다고 볼 수 있다. Welcome 페이지는 /resources/static/index.html 위치에 두면 알아서 웰컴 페이지로 처리해 준다. 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부하였습니다. 2022. 1. 25.
[Spring Boot] : Spring MVC 실용적인 방식 활용 이번에는 전 방식에서 Model을 도입하고 ViewName을 직접 변환하고 @RequestParam을 사용한다. @Controller @RequestMapping("/springmvc/v3/members") public class SpringMemberControllerV3 { 이번에도 마찬가지로 클래스 단위에서 @RequestMapping을 통해 Bean을 경로 이름으로 등록해주었다. @RequestMapping("/new-form") public ModelAndView newForm() { return new ModelAndView("new-form"); } 위 코드를 @RequestMapping(value = "/new-form", method = RequestMethod.GET) public St.. 2022. 1. 24.
[Spring Boot] : Spring MVC 컨트롤러 통합하기 강의를 진행할 때 마다 코드가 점점 깔끔해지고 있다. 이번에는 메서드 단위로 @RequestMapping을 적용하여 컨트롤러 클래스를 유연하게 하나로 통합하는 공부를 한다. @Controller @RequestMapping("/springmvc/v2/members") public class SpringMemberControllerV2 { private MemberRepository memberRepository = MemberRepository.getInstance(); } 우선 자체 클래스에는 @RequestMapping을 적용시키고 @Controller를 적용해 준다. 이 아래 메서드 단위로 각 컨트롤러를 가져와 통합시키는 것이다. @RequestMapping("/new-form") public Mo.. 2022. 1. 24.
[Spring Boot] : Spring MVC 시작 스프링이 제공하는 컨트롤러는 어노테이션 기반으로 동작해 매우 유연하고 실용적이다. 원래 예전에 여러 프레임워크들이 있었는데 @RequestMapping 기반의 어노테이션 컨트롤러가 등장하면서 MVC 부분에서 스프링이 흥하게 되었다고 한다. 실무에서 주로 사용하는 핸들러 매핑과 어댑터는 RequestMappingHandlerMapping과 RequestMappingHandlerAdapter이라고 한다. 이번에는 기존에 사용한 컨트롤러를 @RequestMapping 기반의 스프링 MVC 컨트롤러로 바꿔보는 진도를 나간다. @Controller public class SpringMemberFormControllerV1 { @RequestMapping("/springmvc/v1/members/new-form").. 2022. 1. 24.
[Spring Boot] : 뷰 리졸버에 대해서.. 이번에는 뷰 리졸버이다. @Component("/springmvc/old-controller") public class OldController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("OldController.handleRequest"); return new ModelAndView("new-form"); } } View를 사용하기 위해 마지막에 return 라인을 추가해 주었다. 이렇게 하고 실행을 하면 페이지는 오류가 나지만 print문은 출력이 되는.. 2022. 1. 24.
[Spring Boot] : 스프링이 제공하는 핸들러 매핑과 어댑터 지금은 잘 사용하지 않는 스프링이 제공하는 간단한 핸들러 매핑과 어댑터에 대해 공부한다. public interface Controller{ } 전에는 이렇게 인터페이스 컨트롤러를 만들어서 안에서 ModelAndView를 사용해 주었지만 사실 인터페이스 컨트롤러와 @Controller는 전혀 다르다. 코드를 통해 알아본다. @Component("/springmvc/old-controller") public class OldController implements Controller { } @Component를 사용하여 스프링 빈의 이름을 URL로 해둬서 핸들러 매핑이 가능하도록 해준다. 이렇게 만들면 스프링 빈도 등록이 된 것이고 빈의 이름으로 URL을 매핑하게 되는 것이다. 컨트롤러가 호출되기 위해 2가.. 2022. 1. 24.
[Spring Boot] : Spring MVC 구조 확인하기 직접 만들어 보았던 MVC 프레임워크와 스프링 MVC를 비교했다. 사실 전에 만들었던 MVC프레임워크크 스프링 MVC 구조와 똑같다고 한다. 클라이언트 → 프론트 컨트롤러 → 핸들러 매핑 정보 → 핸들러 어댑터 목록 → 핸들러 어댑터 → 핸들러 → 핸들러 어댑터에서 다시 프론트 컨트롤러 → 뷰 리졸버 호출 → View 반환 → render(model) 호출 → HTML 응답 이런 식이다. 다른점은 FrontController가 스프링 MVC에서는 DispatcherServlet이라는 것과 기존에 스프링 MVC에 이미 있어서 이름을 살짝 바꿔준 항목들 뿐이다. DispatcherServlet이 스프링 MVC의 핵심이다. 디스패처 서블릿은 부모 클래스에서 HttpServlet을 상속 받아 사용하고, 서블릿으.. 2022. 1. 24.
반응형