본문 바로가기

회고록(TIL&WIL)

TIL 2023.02.17 Java Web 8 (H2 DB, Maven-eclipse, Cookie, Session)

H2 Database

in-memory DB 중 하나, 임시적으로 테스트하기에 좋은 데이터베이스이다. 커넥션 성능이 좋은 것 외에는 전부 단점이다.
자바로 개발 되었기 때문에 자바 개발자들에겐 좋은 테스트용 데이터 베이스. 가장 큰 단점은 두테이블의 join 기능

설치 후 H2 console 실행
먼저 임베디드로 연결을 한번 한 후 돌아와서


임베디드로 연결을 하게되면 db 파일이 생성됨


서버로 변경 후 연결
Driver 값과 JDBC URL은 후에 사용되니 값 저장

org.h2.Driver
jdbc:h2:tcp://localhost/~/test


접속 완료

Maven - eclipse

프로젝트 생성 및 설정


앞서서 입력했던 코드와 비교

mvn archetype:generate ^
    -DarchetypeGroupId=org.apache.maven.archetypes ^
    -DarchetypeArtifactId=maven-archetype-webapp ^
    -DgroupId=com.bit ^
    -DartifactId=day51

pom.xml에 서블릿 추가, h2 추가



    javax.servlet
    javax.servlet-api
    3.1.0
    provided


    com.h2database
    h2
    2.1.214

web.xml 스키마 바꿔주기



프로젝트 경로 찾아가서 서블릿 버젼, 자바 버젼 수정

이후 프로젝트 우클릭하여 maven -> update project
main에다가 java 폴더 만들어주고 src에 test폴더 만들고 java 폴더 만들면 자동으로 연동됨

실제로는 이렇게 설정 끝난 maven 프로젝트를 하나 만들어두고 clone 받아오는 방식으로 프로젝트 구성을 시작한다고함.

Cookie

쿠키를 이용한 아이디 저장 구현 쿠키는 보안상으로 취약하기 때문에 일반적으로는 인코딩처리를 한번 해준 다음 전달을 하는 것이 좋다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Cookie[] cookies = request.getCookies();
    if(cookies!=null) {
        for(Cookie cookie : cookies) {
            String key = cookie.getName();
            String val = cookie.getValue();
            log.info("cookie - "+key+":"+val);
            if(key.equals("id")) {
                val = URLDecoder.decode(val, "utf-8");
                request.setAttribute("cookieId", val);
            } else if(key.equals("cb") && val.equals("on")) {
                request.setAttribute("cookieCb", "checked");
            }
        }
    }
    request.getRequestDispatcher("ex01.jsp").forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    String id = request.getParameter("id");
    String pw = request.getParameter("pw");
    String cb = request.getParameter("cb");

    log.info(String.format("%s %s %s", id,pw,cb));
    id = URLEncoder.encode(id, "utf-8");
    Cookie cookie = new Cookie("id", id);
    Cookie cookie2 = new Cookie("cb", cb);
    cookie.setMaxAge(30); // 유효기간 - 초단위 ex)일주일7*24*60*60
    response.addCookie(cookie);
    response.addCookie(cookie2);
    request.getRequestDispatcher("result.jsp").forward(request, response);
}

Web Storage

javasciprt를 이용하여 프론트에서 사용하는 저장소

localStrage

쿠키처럼 사용 가능

localStorage.setItem('key1','val1');
localStorage.getItem('key1');

sessionStrage

sessionStrage.setItem('key2','val1');
sessionStrage.getItem('key2');

session

동일 브라우저, 동일 접속인지 구분하기 위해서 최초 요청 시 JSSESIONID 라는 쿠키를 만들게되는데 이를 통해 구분을 한다.
구현하는 방식은 언어마다 다르겠지만 키값이나 원리는 다 똑같다. 일반적으로 세션은 서버의 메모리를 사용한다.
그렇기 때문에 병렬처리에 문제가 생긴다. 이를 해결하기위해 정보의 중요도가 적기 때문에 빠르고 많은 커넥션을 처리 가능한 메모리 DB를 사용한다.

로그아웃

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 로그아웃
    HttpSession session = req.getSession();
//	session.setAttribute("id", null);
//	session.removeAttribute("id");
    session.invalidate();
    req.getRequestDispatcher("ex02.jsp").forward(req, resp);
}

파일 업로드

의존성 추가

<!-- https://mvnrepository.com/artifact/servlets.com/cos -->
<dependency>
    <groupId>servlets.com</groupId>
    <artifactId>cos</artifactId>
    <version>05Nov2002</version>
</dependency>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.getRequestDispatcher("ex03.jsp").forward(req, resp);
}
	
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    int max = 1024*20; //byte
    String upload = req.getRealPath("/upload"); // 실제로 실행되는 tomcat server의 upload 폴더 바로 적용될 수 있도록
    System.out.println(upload);
    FileRenamePolicy frp = new DefaultFileRenamePolicy(); // 중복파일 정책
    MultipartRequest mreq = new MultipartRequest(req,upload,max,frp);
    String name = mreq.getParameter("name");
    String oldname = mreq.getOriginalFileName("file1"); // 등록 이름
    String filename = mreq.getFilesystemName("file1"); // 중복시 정책에 따라 변경될 이름
    System.out.println(filename + ":" + oldname);
    req.setAttribute("old", oldname);
    req.setAttribute("new", filename);
    req.getRequestDispatcher("ex04.jsp").forward(req, resp);
}