간단한 게시판을 만들어보는 숙제로 개인 프로젝트를 하게 되었다.

과제는 아래의 조건이다.

 

  •  간단한 게시판
  • 게시글을 작성할 때, 닉네임, 제목, 내용을 입력
  • 비밀글에 한해서만 닉네임, 제목, 내용과 함께 비밀번호를 입력하고, 비밀번호를 통해 열람 가능해야함
  • 에디터는 네이버 에디터를 이용
  • 파일 첨부는 n개지만 총 파일의 용량이 100MB를 넘어서선 안됨.
  • 댓글 기능 (대댓글은 x)
  • 페이징 (10개 단위로 게시글 출력)
  • 검색 조건은 제목, 내용, 제목과 내용
  • 글 삭제 가능해야함
  • JAVA는 1.8, Tomcat은 8~9 사이, DB는 mariadb 10.x 사용

현재 나는 에디터와 페이징에 약간의 에러 그리고 파일 첨부는 구현하지 못했지만 나머지 기능들은 구현했다.

지금까지의 프로젝트의 구조는 아래와 같다. 

 

 웹 프로그래밍을 배우지 않았고, java script, html을 1월 4일 때 처음 접했기 때문에, 우선은 프로젝트를 위해 필요한 지식만 jsp를 만들어보면서 배우게 되었다. 

 이번 프로젝트를 통해 스프링을 이용해 MVC 방식으로 게시판을 완성하는 것에 목표를 두었다. 

 

 프로젝트에 소개를 하자면 main 파일은 크게 4가지로 구성되어있다. 변수를 가진 board와 board의 컨트롤러, service와 dao로 구성 되어있다. 그리고 views는 8가지의 뷰가 존재하지만 실제 사용하는 뷰는 content, index, inseartBoard, listPage, searchListPage, secretPage 총 6가지로 구성되어있다.

 

 컨트롤러는 총 11가지의 기능을 @RequestMapping을 통해 servie에게 요청하고, dao에서 수행한 뒤 돌아와 jsp 파일에 데이터를 넘겨주게 된다. 

 

 가장 처음 구현했던 건 게시글 목록을 구현했다.

 

주소에서 list를 받으면 service.getBoardList에게 Board의 객체를 준 뒤, List<Board>의 객체를 받아오게 된다. 이를 model에 넣어 listPage.jsp로 보내게 된다.

 

 

 

 

 아직 마이바티스를 잘 다루지 못하기 때문에 JDBC를 이용했다. connection을 통해 내 DB의 주소, 아이디, 비밀번호를 입력해 연결한 뒤, Statment 또는 PreparedStatement로 sql를 질의하게 된다. 하나의 데이터를 가져오기 위해 질의한다면 if (rs.next())를, 여러 개의 데이터를 가져오기 위해 질의한다면 while(rs.next())를 사용했다. 이러한 정보를 Board의 객체인 t로 받아, List<Board>에 넣은 후 반환했다. 이 정보를 약간의 가공 후, jsp 파일로 넘겨주는 간단한 방식으로 게시판을 만들었다. 

 

 구현 결과는 아래와 같다.

 

쿠키와 세션을 먼저 얘기하기 전, 한 가지 알아야할 게 있어. HTTP 통신에 대해 먼저 알아야 해 !

 

HTTP이란?

 HTTP는 클라이언트-서버 프로토콜이야. HTTP는 클라이언트와 서버 사이를 연결을 맡고있지. 

브라우저를 통해 웹 사이트를 돌아다닐 때, 우리는 웹 사이트를 방문하기 위해 서버에게 요청을 해. 서버는 요청을 받은 뒤 허락한다는 응답을 보내게 돼. 이렇게 간단하고, 대단해보여도 여러가지 문제점이 발생할 수 있어.

 

 클라이언트와 서버간의 응답이 끝난 후, 다른 웹 페이지를 방문했다가 다시 돌아오게 된다면 정보에 손실이 발생하거나, 불편한 점 등이 발생할 수 있어. 왜냐하면 이미 했던 프로토콜을 다시 한 번 진행하며, 아까 내가 했던 일들이 사라지기 때문이야.

 

 

 그렇기에 우리는 쿠키와 세션이라는 기능을 이용해 이러한 문제점을 해결하지 ! 쿠키와 세션에 대해 알려줄게 !

쿠키란 HTTP의 일종으로, 사용자가 웹 사이트를 방문할 때, 사이트의 서버에서 내 컴퓨터로 저장되는 txt형식의 작은 기록 정보 파일을 말해.

쿠키는 웹 사이트를 방문할 때마다 수시로 정보가 바뀌고, 전역 변수로 설정되어, 사이트 모든 페이지에서 읽을 수 있지 !  이 덕분에 우리는 방문했던 사이트를 좀 더 빠르게 이용할 수 있게 되었어.

 

 세션은 쿠키와 비슷한 목적이지만 반대의 방식을 사용하고 있어. 쿠키는 서버가 내 컴퓨터로 작은 파일을 저장했다면, 세션은 사용자가 브라우저를 종료하기 전까지, 서버가 클라이언트의 요청을 유지하게 만드는 기술이야. 사용자가 브라우저에 접속해, 서버로 요청을 하면, 자동 생성되고 서버의 메모리에 저장해 !

 

 쿠키와 세션의 차이점을 정리해볼까?

 저장위치를 기준으로, 쿠키는 로컬에 저장하지만 세션은 로컬과 서버에!

 보안을 기준으로, 쿠키는 탈취 및 변조가 가능하지만 세션은 서버에 저장되어있기 때문에 상대전으로 안전!

 생명주기를 기준으로, 쿠키는 브라우저를 종료해도 남아있지만, 세션은 브라우저 종료시 세션을 삭제!

 속도를 기준으로, 쿠키는 파일에서 읽기에 상대적으로 빠르고, 세션은 서버에서 처리하기에 상대적으로 느려!

 

 

 include 디렉티브에 대해 말하기 앞서, 디렉티브의 정의에 대해 설명해줄게.

JSP의 디렉티브는 클라이언트의 요청에 JSP 페이지가 실행될 때 필요한 정보를 JSP 컨테이너에게 알려주는 역할이야. 3가지의 디렉티브 중 include 디렉티브는 여러 개의 JSP 페이지에서 공통적으로 포함하는 내용을 별도의 파일로 저장한 뒤, 필요 시에 JSP 페이지 내에 삽입할 수 있는 기능을 제공해 줘.

  <%@ include file= "파일" %>

 

 하지만 include 액션 태그는 디렉티브와 약간 달라. 액션 태그는 페이지와 페이지 사이의 제어를 이동과 같은 동작을 지시하는 태그야. 그 중 include 액션 태그는 다른 페이지의 실행 결과를 현재 사용하는 페이지에 포함할 수도 있어. 

   <jsp:include page="파일" flush="true" />

 

 이 둘의 공통점은 include 디렉티브와 include 액션 태그 모두 요청을 해, 다른 파일을 가져올 수 있어.

 이 둘의 차이점은 컴파일 방식에서부터 차이가 나. include 디렉티브는 정적 방식으로 include 파일과 함께 컴파일 되지만, include 액션 태그는 동적 방식으로 include 페이지와 별개로 컴파일 돼.  그리고 목적에서 차이점을 보여, include 디렉티브는공통으로 사용되는 변수를 저장해 사용하기 위한 목적으로 이용되지만 include 액션 태그는 화면의 레이아웃 중 일부를 모듈화할 때 사용돼. 이외에도 처리시간, 기능, 데이터 전달방법에서 약간씩 차이점이 있어. 자세한 건 아래의 표를 참고하면 좋을 것 같아.

 

 

 최범균의 JSP2.2 웹프로그래밍 중 일부

  

'웹 프로그래밍' 카테고리의 다른 글

쿠키와 세션의 차이점은 무엇일까?  (0) 2021.01.07

 추상 클래스부터 설명해볼까?

 

 추상 클래스는 실체 클래스에서 공통적인 부분만 가지고 선언한 클래스야.

부모와 자식 클래스에 꼭 필요한 부분인 변수와 메소드만을 가졌지만, 적어도 하나 이상 abstract, 즉 추상 메소드가 존재하고 있어.

 

 예시를 들어볼까? 부모 클래스인 Mammalia(포유동물)은 자식 클래스인 Human, Dog, Lion을 가지고 있다고 가정하자.

포유동물은 성대를 가지고 있기에, 모두 울부짖을 수 있어. 그렇다면 이 공통점은 소리낸다 라는 공통적인 행동이 있어.

하지만 포유동물은 어떻게 소리를 내는 지 몰라, 그래도 우리의 목적을 달성해야만 해.

다행이도, 우리는 사람, 개, 사자가 모두 어떻게 소리를 내는 지 알고 있지.

 

 그렇다면 Mammalia 클래스의 소리낸다 라는 메소드를 추상처리하고, Human, Dog, Lion 클래스는 각 각 '아', '왈 왈', '어흥' 이라는 기능을 각 각 오버라이딩하면 돼 ! 

 

 이번엔 인터페이스를 설명해보자 ! 

인터페이스는 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형이야. 

인터페이스? 추상 클래스와 정말 비슷해, 인터페이스로 작성되는 대부분의 메소드는 추상 메소드이기 때문이야. 

 

 ?? : 그렇다면 인터페이스랑 추상 클래스는 무슨 차이에요?

 

추상 클래스랑 비슷해, 다만 목적은 아주 약간 달라. 추상 클래스의 목적은 서브 클래스에서 구현할 수밖에 없는 기능만을 추상 메소드로 선언해 구현하려 하지만 인터페이스의 목적은 클래스의 목적에 따라 인터페이스의 모든 추상 메소드를 만들도록 하는 거야. 

 

 예시를 들어보자 ! 

 인터페이스가 없다면 어떤 일이 실세계에서 펼쳐질까 ? 

동일한 규격이 없어! A 공장은 볼트를 만들고, B 공장은 너트를 만들어도, 서로 사용할 수 없어. 규격이 맞지 않아 너트가 들어가지 않거나, 너무 커서 쉽게 빠져 버리게 될꺼야. 

 

 이 추상 클래스와 인터페이스는 서로 비슷하면서 다른 점도 많아.

추상 클래스와 인터페이스는  둘 다 객체를 생성할 수 없어. 그리고 상속을 위한 슈퍼 클래스로만 사용 가능해.

그리고 클래스의 다형성을 실현하기 위한 목적이지.

 

 하지만 차이점도 있지. 추상 클래스는 추상 메소드와 일반 메소드 그리고 상수와 변수로 구성되었어.

인터페이스는 상수와 추상 메소드로 구성되어있지만 default 메소드, static 메소드도 구현 가능해. 여기서 니가 꼭 기억해야할 내용은 이거야. 

추상 클래스는 단일 상속이지만 인터페이스는 다중 상속이 가능하다는 점, 꼭 기억해야해!!! 

 

 내가 이번 추상 클래스와 인터페이스를 공부하면서 이런 고민을 하게 되었어.

나는 어떤 상황일 때, 추상화를 사용하고, 인터페이스를 사용하지?

 

 내 생각은 이래, 부모 클래스와 가까운 클래스에는 인터페이스 구현은 선택사항인 것 같아. 

추상 메소드를 인터페이스로 하든, 추상 클래스로 하든 큰 상관은 없으니깐.

 

 하지만 부모 클래스와 먼 자식 클래스 사이에서는 인터페이스를 사용할꺼야. 

 예를 들어보자. 부모 클래스 통신 장비에서 여러 자식 클래스를 거쳤다는 가정을 하자. 통신 장비와는 먼 무전기와 스마트폰이라는 자식 객체가 있을 때, 무전기와 스마트폰의 공통점은 통신하다() 라는 메소드 뿐이야. 하지만 무전기도 와이파이를 사용했으면 좋겠고, 스마트폰은 위성통신을 할 수 있었으면 좋겠다고 생각이 든다면. 인터페이스를 통해 와이파이(), 위성통신()을 스마트폰과 무전기에 주입할 수 있겠지.

 

 

 

+ Recent posts