메시지가 단순 텍스트인 경우파라미터와 다르게 HTTP 메시지 바디를 통해 데이터가 넘어오는 경우, @RequestParam, @ModelAttribute를 사용하지 못한다.(Form 형식으로 전달되는 경우에는 요청 파라미터로 인정된다.) InputStream (서블릿)HTTP 메시지 바디의 데이터를 InputStream을 활용해 직접 읽을 수 있다.@PostMapping("/request-body-string-v1")public void requestBodyString(HttpServletRequest request, HttpServletResponse response) throws IOException { ServletInputStream inputStream = request.getInputSt..
기본, 헤더 조회애노테이션 기반의 스프링 컨트롤러는 다양한 파라미터를 지원한다. 고로 이전에 사용했던 HttpServletRequest, HttpServletResponse 등 다양한 객체를 사용할 수 있다.@Slf4j@RestControllerpublic class RequestHeaderController { @RequestMapping("/headers") public String headers(HttpServletRequest request, HttpServletResponse response, HttpMethod httpMethod, Locale loc..
요청 매핑@Controller는 반환 값이 String이라면 View 이름으로 인식된다. 그래서 해당 이름의 뷰를 찾고 뷰를 랜더링 한다. 그러나 @RestController는 반환 값으로 뷰를 찾는 것이 아닌, HTTP 메시지 바디에 바로 입력한다. @RequestMapping에서 속성을 배열로 하여 다중 설정을 할 수도 있다. @RequestMapping(value = {"/hello-basic", "/hello-go"}, method = RequestMethod.GET) public String helloBasic() { log.info("helloBasic"); return "ok"; }@RequestMapping을 사용시에는 method 속성을 지정하지 ..
프로젝트 생성https://start.spring.io/에서 아래의 사진과같이 프로젝트를 생성한다.주의할것은 Pakaging 부분이다. JSP를 사용하지 않기 때문에 JAR를 사용하는 것이 좋다. JAR를 사용하게 되면 항상 내장 서버(톰캣 등)를 사용하고, webapp 경로도 사용하지 않는다. 최근에는 주로 이 방식을 사용한다. WAR를 사용하면 내장 서버도 사용가능 하지만, 주로 외부 서버에 배포하는 목적으로 사용한다. 그리고 LOMBOK 사용을위해 ctrl+alt+s를 눌러 (Settings) Annotation 검색, 맨 상단 Enable antotation processing에 체크해준다. Welcome 페이지 생성스프링 부트 + Jar 를 사용하면 /resources/static/ 위치에 in..
스프링 MVC 전체 구조우리가 여태 직접 만들었던 프레임워크와 스프링 MVC를 비교하면 아래와 같다.FrontController => DispatcherServlethandlerMappingMap => HandlerMappingMyHandlerAdapter => HandlerAdapterviewResolver => ViewResolverMyView => ViewSpring MVC의 동작 순서핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.핸들러를 실행할 수 있는 핸들러 어댑터를 조회하고, 실행한다.핸들러 어댑터가 실제 핸들러를 실행한다.핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환하여 반환한다.viewResolver를 찾고 실행한다.뷰 리졸버는 뷰의 논리이름..
프론트 컨트롤러 패턴 프론트 컨트롤러 도입전 공통 로직이 필요한 경우 먼저 앞의 공통 로직들을 깔고 별도의 컨트롤러 로직을 작성했어야 했다. 그러나 이 경우에는 아무데서나 다 들어올 수 있기 때문에 공통 로직을 여기저기에 만들어야하는 단점이 생긴다. 프론트 컨트롤러를 도임하면 간단히 말해 servlet이라 말할 수 있다. 프론트 컨트롤러에 공통로직은 다 몰고, 각 컨트롤러가 필요한 로직은 각자 처리하는 것이다. FrontController 패턴 특징프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아 호출공통 처리 가능나머지 컨트롤러는 서블릿을 사용하지 않아도 됨스프링 웹MVC의 핵심도 바로 FrontController. 스프링 웹 MVC의 Dispatch..
회원 관리 웹 애플리케이션 요구사항회원 정보이름 : username나이 : age기능 요구사항회원 저장회원 목록 조회먼저 domain 패키지를 만들어 member Class를 만든다.package hello.servlet.domain.member;import lombok.Getter;import lombok.Setter;@Getter@Setterpublic class Member { private Long id; private String username; private int age; public Member() { } public Member(String username, int age) { this.username = username; thi..
프로젝트 생성사전 준비Java 17 이상 설치IDE : IntelliJ 또는 Eclipse 설치스프링 부트 스타터로 이동해 스프링 프로젝트를 생성한다.설정은 사진을 참고해 작성하면된다. 주의할 점은 Packaging 부분! JSP를 실행하기 위해서 War로 선택해야 한다. 이제 스프링 부트 환경에서 서블릿을 등록하고 사용해보자.참고로 서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접 설치하고, 그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린 다음, 톰캣 서버를 실행하면 된다. 이 과정이 매우 번거롭다.스프링 부트는 톰캣 서버를 내장하고 있으므로, 톰캣 서버 설치 없이 편리하게 서블릿 코드를 실행할 수 있다. Hello Servlet스프링 부트 서블릿 환경 구성@ServletComponentScan 어노..
웹 서버, 웹 애플리케이션 서버웹은 모두 HTTP를 기반으로 통신한다. HTTP 메시지에는 거의 모든 형태의 데이터 전송이 가능하다. 서버간 데이터를 주고 받을 때에도 대부분 HTTP를 사용한다.HTML, TEXTIMAGE, 음성, 영상, 파일JSON, XML (API) 웹 서버(Web Server)웹 서버는 인터넷을 기반으로 클라이언트에게 웹 서비스를 제공하는 컴퓨터이다. 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠(HTML, CSS, JS, 이미지, 영상 등)를 제공한다. 이때 클라이언트는 HTML을 응답받고 서버는 HTTP에 대한 데이터를 만들어 응답한다. 대표적으로 NGINX와 APACHE가 존재한다. 웹 애플리케이션 서버(WAS - Web Application Server)웹 서버와 다르..
AOP가 필요한 상황 예를들어 1000개의 메소드의 호출 시간을 알고싶어 아래의 코드를 작성했다고 가정하자.package hello.hellospring.service;import hello.hellospring.domain.Member;import hello.hellospring.repository.MemberRepository;import org.springframework.transaction.annotation.Transactional;import java.util.List;@Transactionalpublic class MemberService2 { private final MemberRepository memberRepository; public MemberService2(Membe..