Spring
[Spring Web MVC] Thymeleaf (2)
[Spring Web MVC] Thymeleaf (2)
2022.08.20타임리프는 스프링 없이도 잘 동작하지만, 스프링과의 통합을 위한 편리한 기능들을 많이 제공한다. 기능을 하나하나 살펴보자. 입력 폼 처리 상품명 타임리프를 사용하기 전 모델을 통해 item 객체를 넘겨준다. *{...} 은 선택 변수 식으로 th:object 에서 선택한 객체에 접근한다. ( ${item.itemName} 으로 작성해도 된다. ) th:field 는 폼에서 id / name / value 속성을 자동으로 만들어준다. (th:field 에서 지정한 이름으로 설정된다.) HTML 폼에 체크박스가 있는 경우 전송해서 POST 방식으로 서버에게 요청하면 서버에서 요청 값을 확인 시 체크박스가 선택된 경우 해당 값이 true 로, 체크박스가 선택되지 않은 경우 해당 값이 null로 초기화 돼 있다..
[Spring Web MVC] Thymeleaf (1)
[Spring Web MVC] Thymeleaf (1)
2022.08.19타임리프 뷰 템플릿 엔진은 백엔드 서버에서 HTML을 동적으로 렌더링 할 때 사용된다. 스프링과 통합이 가장 잘 되는 뷰 템플릿이고, 제공하는 기능도 가장 많아서 뷰 템플릿 중에서는 타임리프를 많이 사용한다. 텍스트 th:text 사용 sdqwfe 컨텐츠 안에서 직접 출력하기 = [[${data}]] ${data} 를 통해 sdqwfe를 모델로 전달받은 data로 바꿔서 렌더링한다. HTML 컨텐츠 영역 안에서 직접 데이터를 출력하려면 [[]] 를 사용한다. th:utext = [(...)] = [(${data})] 이스케이프 기능을 사용하지 않고 렌더링하려면 utext 혹은 [()] 를 사용한다. 변수 기본적으로 변수 표현식 ${...} 을 사용해서 변수를 사용한다. SpringEL 표현식 Object..
[Spring Web MVC] Spring MVC와 Thymeleaf 예시
[Spring Web MVC] Spring MVC와 Thymeleaf 예시
2022.08.18스프링 MVC를 사용해 아주 간단한 쇼핑몰 프로젝트를 진행해보자. 여기서 검은색은 컨트롤러고, 컨트롤러를 통해 뷰를 호출한다. 이렇게 요구사항이 정리되면 디자이너 / 웹 퍼블리셔 / 백엔드 / 프론트엔드 개발자가 업무를 분담해서 프로젝트를 진행한다. 디자이너 : 디자인하고 결과물을 웹 퍼블리셔 혹은 프론트엔드 개발자에게 넘겨준다. 웹 퍼블리셔 : 디자인을 바탕으로 HTML CSS를 만들어 개발자에게 넘겨준다. 백엔드 : HTML CSS 가 나오기 전까지는 시스템을 설계하고 비즈니스 모델을 개발한다. 이후 화면이 나오면 뷰 템플릿으로 변환해 동적으로 화면을 구성하고 흐름을 제어한다. 프론트엔드 : 디자인을 바탕으로 HTML CSS를 만드는 역할도 하고, HTTP API를 통해 웹 클라이언트가 요구하는 데이..
[Spring Web MVC] 응답 정보 다루기
[Spring Web MVC] 응답 정보 다루기
2022.08.17정적 리소스 / 뷰 템플릿 (동적) / HTTP 메세지 응답도 이렇게 세 가지 방법으로 나눌 수 있다. 정적 리소스 /src/main/resources 다음 경로의 /static /public / resources /META-INF/resources 해당 디렉토리에 정적 리소스를 제공한다. src/main/resources/static/basic/adsf.html 파일이 들어있으면 웹 브라우저에서는 basic/asdf.html 을 입력해서 파일을 열어볼 수 있다. 뷰 템플릿 뷰 템플릿을 거쳐 HTML이 생성되고, 뷰가 응답을 만들어 전달한다. (HTML 외에 뷰 템플릿이 만들 수 있는건 다 가능) 보통 WEB-INF 디렉토리에 위치하도록 해서 웹 브라우저에서 직접 접근이 불가능하도록 설정한다. 이 부분은..
[Spring Web MVC] 요청 정보 다루기
[Spring Web MVC] 요청 정보 다루기
2022.08.17@GetMapping("/mapping/{userId}") public String mappingPath(@PathVariable("userId") String id){ log.info("logging... {}", id); return "chk"; } URL 경로에 변수를 넣어 템플릿 형식으로 설정할 수 있고, @PathVariable 애너테이션으로 그 값을 꺼내 메서드에서 사용할 수 있다. (경로 변수) @GetMapping("/mapping/users/{userId}/order/{orderID}") public String mappingPath(@PathVariable("userId") String id, @PathVariable("orderID") String order){ log.info("lo..
[Spring Basic] 로그
[Spring Basic] 로그
2022.08.16스프링은 SLF4J (Simple Logging Facade for Java) 를 인터페이스로 여러 가지 로그 라이브러리들을 제공한다. 스프링이 기본적으로 제공하는 Logback 로그 프레임워크에 대해 살펴보자. @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); l..
[Spring Web MVC] Spring MVC
[Spring Web MVC] Spring MVC
2022.08.16실제 Spring MVC 프레임워크의 구조이다. 지난번에 만든 MVC 프레임워크와 크게 다른 점은 없다. 다르게 사용되는 용어들만 새로 정리하자. FrontController -> DispatcherServlet handlerMappingMap -> HandlerMapping MyHandlerAdapter -> HandlerAdapter ModelView -> ModelAndView viewResolver -> ViewResolver (Interface) MyView -> View (Interface) 여기서 DispatcherServlet이 가장 중요하다. 프론트 컨트롤러 대신 사용하는 용어로, 역시 HttpServlet을 상속받아 서블릿으로 동작한다. WebSerblet 애너테이션을 사용하는 대신 스..
[Spring Web MVC] Adaptor
[Spring Web MVC] Adaptor
2022.08.16서버에서 클라이언트로 데이터를 전송할 때 ModelView 객체를 만들어서 데이터를 전송하기도 하고 Map 자료구조를 사용해 데이터를 전송하는 방식도 경험 해 봤는데.. 특정 부분에는 첫 번째 방식을, 또 어느 부분에는 두 번째 방식을 사용해 데이터를 전송하게 할 수는 없을까? 어댑터 패턴을 사용하면 프론트 컨트롤러가 다양한 방식의 컨트롤러를 처리할 수 있다. 핸들러 : 클라이언트의 요청을 처리하는 객체 (컨트롤러) 클라이언트의 요청의 URL에 따라 매핑된 정보를 핸들러 매핑을 통해 조회한다. 그 후 프론트 컨트롤러는 해당 컨트롤러를 직접 호출하지 않고 핸들러 어댑터를 통해 호출해야 한다. 핸들러 어댑터에게 핸들러를 넘겨주면 핸들러 어댑터는 해당하는 핸들러를 호출해 실행 결과를 받고 프론트 컨트롤러에게 ..
[Spring Web MVC] Model
[Spring Web MVC] Model
2022.08.15컨트롤러 입장에서는 request 객체를 Model로 활용하는 것 외에는 사용하지 않는다. 그러면 Model 객체를 따로 만들면 컨트롤러는 request와 response를 아예 신경쓰지 않게 할 수 있지 않을까? 또, 뷰의 이름에서 중복되는 부분을 프론트 컨트롤러가 단순화하도록 하면 뷰의 이름도 간단하게 작성할 수 있지 않을까? 귀찮은 일은 프론트 컨트롤러로 등록된 서블릿에게 맡기고, 핵심 로직은 컨트롤러가 맡도록 하자. @Getter @Setter public class ModelView { private String viewName; private Map model = new HashMap(); public ModelView(String viewName) { this.viewName = viewNa..
[Spring Web MVC] Front Controller
[Spring Web MVC] Front Controller
2022.08.15프론트 컨트롤러를 도입해 공통되는 요소를 하나로 묶어서 처리할 수 있다. 프론트 컨트롤러 역할을 수행하는 서블릿 하나로 클라이언트의 요청을 받고, 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출한다. 해당 컨트롤러만 서블릿으로 등록해서 사용할 수 있어 편리하다. public interface ControllerV1 { void process(HttpServletRequest request , HttpServletResponse response) throws IOException, ServletException; } 서블릿과 비슷한 형태의 컨트롤러 인터페이스를 도입하자. 각 컨트롤러들은 해당 인터페이스를 구현하고, 프론트 컨트롤러는 인터페이스를 호출해 구현에 상관 없이 로직의 일관성을 가진다. @We..
[Spring Web MVC] 서블릿과 HTTP 통신
[Spring Web MVC] 서블릿과 HTTP 통신
2022.08.14서블릿을 직접 사용해보자. @WebServlet(name = "helloServlet", urlPatterns = "/hello") public class HelloServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("start!"); } } @ServletComponentScan 애너테이션으로 스프링이 서블릿을 등록해서 사용할 수 있도록 하자. @WebServlet 애너테이션은 서블릿 이름과 URL 매핑을 지정한다. 스프링이 내장 톰캣 서버를 실행한다...
[Spring Web MVC] 웹 애플리케이션
[Spring Web MVC] 웹 애플리케이션
2022.08.13웹은 HTTP 프로토콜을 기반으로 통신한다. Web Server : 정적 리소스와 기타 부가기능을 제공한다. (APACHE, nginx) Web Application Server : 웹 서버 기능 + 동적 리소스를 제공한다. (Tomcat) / 애플리케이션 코드를 실행하는데 특화됨. 스프링 MVC는 WAS 에서 동작한다. 웹 시스템은 WEB / WAS / DB로 구성된다. 웹 서버는 정적 리소스를 처리하고, 중요한 애플리케이션 로직은 웹 애플리케이션 서버가 담당한다. WAS 하나로 두 작업을 함께 처리할 수도 있지만, 서버의 안정성과 효율적인 리소스 관리를 위해 이렇게 설계하는 편이 합리적이다. 이렇게 설계 시 웹 애플리케이션 서버가 죽더라도 웹 서버가 살아서 클라이언트에게 오류 메세지를 보내줄 수 있다..