iknowahra / cspiEdu

CSPI OJT
0 stars 0 forks source link

2021.10.12 교육내용 정리 #17

Open iknowahra opened 2 years ago

iknowahra commented 2 years ago

2021.10.12

//src>....>web.xml
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>

<load-on-startup>1</load-on-startup> // 서블릿이 여러 개 일 때, 우선순위

    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

web.xml 설정 파일이라서 스프링 파일을 실행하기 전에 위의 파일을 먼저 확인한다.



post로 보내면 하나의 객체로 묶어서 보내는데, 이 객체가 어떤 타입인지 몰라서 한글이 깨짐. 이 한글 깨짐을 방지하기 위해서web.xml에서 하단의 필터를 이용해서 한글 깨짐을 방지한다. 모든 url에 대해서 UTF-8 인코딩을 적용한 필터를 사용하겠다는 내용

<filter> 
    <filter-name>encodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
       <param-name>encoding</param-name> 
       <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
       <param-name>forceEncoding</param-name> 
       <param-value>true</param-value> 
    </init-param> 
 </filter> 
 <filter-mapping> 
    <filter-name>encodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
 </filter-mapping>



※ 주의! .jsp파일에서도 UTF-8 설정이 되었는지 반드시 체크해줘야 한다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> 



Getter n Setter

vo는 데이터를 담기 위한 클래스다 (전자정부 프레임에서 VO를 주로 씀 = 실무에서 주로 사용) VO = Value Object 즉, 일반 클래스가 런타임 때 자료를 담기 위한 순수하게 value나 data만을 담기 위한 클래스란 뜻이다. 주로 퍼블릭 생성자와 속성(컨벤션에 맞는 getter/setter 조합)을 갖는 단순한 데이터를 담는 클래스를 의미한다.

package com.ahra.www.vo;

public class FormTestVo {

    private String title;
    private String contents;
    private String view;

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContents() {
        return contents;
    }
    public void setContents(String contents) {
        this.contents = contents;
    }
    public String getView() {
        return view;
    }
    public void setView(String view) {
        this.view = view;
    }   
}

위의 FormTestVo를 사용하기 위해선 json 데이터를 자바가 읽을 수 있는 Map으로 파싱해주는 패키지가 필요하다. jackson.core 는 maven repository 사이트에서 검색해서 원하는 버전을 찾아서 pom.xml파일에 다음과 같이 복붙해주면 된다.


JacksonJSON데이터를 출력하기 위한 MappingJacksonHttpMessageConverter를 제공한다. 만약 우리가 스프링 MessageConverter를 위의 MappingJacksonHttpMessageConverter으로 등록한다면, 컨트롤러가 리턴하는 객체를 다시 뜯어(자바 리플렉션 사용\), JacksonObjectMapper APIJSON 객체를 만들고 난 후, 출력하여 JSON데이터를 완성한다.

(출처 : Jackson에 대한 자세한 설명은 이곳을 클릭하세요)

// pom.xml
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.13.0</version>
    </dependency>



Servlet 에서 Spring 으로 데이터 가져오기

기존의 servlet 방식에서 데이터를 가져오기

@RequestMapping(value="saveGet", method = RequestMethod.GET)
    public String saveGet (HttpServletRequest request, Model model) {
        String title = request.getParameter("title");
    }

Spring의 annotation 으로 데이터를 가져오기

@RequestMapping(value="saveGet", method = RequestMethod.GET)
    public String saveGet 
        (HttpServletRequest request, Model model, 
        @RequestParam(value = "title", defaultValue = "This is title") {
            System.out.println("title = " + title); // title = _____            
}



한 걸음 더 나아가서 vo 를 통해서 데이터를 저장하고 꺼내오기

package com.ahra.www.vo;

// @Getter @Setter 
// lombok은 편리하지만, 실무에선 여러 사람에게 세팅을 해줘야 하는 부분이라 지양하는 경향이 있다.
public class FormTestVo {
    private String title;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}    


//FormController.java
@RequestMapping(value="savePost", method = RequestMethod.POST)
public String savePost (HttpServletRequest request, Model model, 
                        FormTestVo formTestVo) {

        model.addAttribute(formTestVo); 
    // value - key pair로 담아주지 않아도 jackson-core 라이브러리가 
    // model.addAttribute ("formTestVo", formTestVo) 로 설정해줌..
    // 바로 담아줘도 ok. Map으로 형변환 하지 않아도 됨.
        return "form/viewer";
    }



과제 : 아래의 한 개 다운로드 하기 (미리 db주소를 주니까 연결해서 써보기)

HeidiSQL(가벼움), DBeaver (library를 설치하면 여러개의 db호환 가능), sqlyog (무거움)



국내에서 주로 쓰는 db : mssql, oracle(tibero), mysql



다음 시간에는 db query 를 배워보자...!

iknowahra commented 2 years ago
<!-- views > form > viewer.jsp -->
<ul>
 <li>title=${formTestVo.title}</li>
 <li>contents=${formTestVo.contents}</li>
 <li>discloser=${formTestVo.view}</li>
</ul>


궁금했던 점 : formTestVo는 getter, setter 형식으로 데이터를 꺼내고 저장할 수 있게 되어 있는데 왜 .jsp 파일에서는 formTestVo.title이런 식으로 바로 가져올 수 있을까?


=> 이유는 jackson.core 라이브러리가 formTestVo를 변환해줘서 괜찮음....(이게 맞는 건지 여전히 궁금하네요....)

choi-hyeongseok commented 2 years ago

죄송합니다... 늦게 확인했네요.... 제가 강의 중에 듣기로는 사용자가 post 형식으로 요청을 하였을 때 객체 타입의 데이터를 담아서 보내게 될 수 있습니다. 이 객체는 html 웹에서 전송을 하게 되면, json 형식으로 전송되는데 자바에서는 map 형식 ?? 으로 객체를 담기 때문에... 변환이 필요하고 이것을 jackson.core 라이브러리가 자동으로 인식하고 변환을 시켜주는 것 같습니다... 궁금하신 부분은 jstl 에 특징이라고 생각됩니다. jstl 에서는 객체 형식을 가져 와서 formTestVo.title 처럼 입력하였을 때 자동으로 getter 로 인식하게 설정을 하여서 formTestVo.title 형식으로 입력을 하여도 formTestVo.title.getter()처럼 인식해서 가져오는 거 같습니다... 저도 자세히는 몰라서 제가 이해한 내용으로 전달 드립니다...

https://u-it.tistory.com/8 해당 블로그 내용을 참고 하시면 이해에 도움이 되실 거 같은데... 이해가 안되시면 수업 이전에나 이후에 궁금하신 점을 해결하는데 도움을 드리겠습니다.... 저도 잘 몰라서 공부하는데 도움이 될 거 같네요.. 감사합니다...

iknowahra commented 2 years ago

@choi-hyeongseok 오오!! 궁금한 점이 해결 되었습니다. 감사합니다!!