ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring + MyBatis + DB = 작은 웹사이트 - (7) 본격 게시판 만들기 서막
    개발/Web Project (1) - Spring MVC + java + DB 2018. 1. 17. 22:48

    오잉 별것도 안했는데 벌써 7번째 포스팅이라니 이게 무슨 일이오

    아무튼 이번에는 드디어ㅠㅠ 게시판을 붙여보는 시간이다.


    되도록이면 한방에 포스팅을 정리하고 싶어서 페이징 처리까지 끝낸 뒤에 글을 쓰려다보니 조금 시간이 걸렸다.

    참 신기하게도 분명 내가 예전에 써서 잘 돌아갔던 기능들인데 다시 이 프로젝트를 진행하면서 재활용하려니까 안 먹는 것들이 있다.

    물론 내가 능력이 부족해서 개발환경 세팅이라던가 뭐 그런데서 실수했겠지 ㅠㅠ 하면서도 짜증나는 이 기분

    덕분에 실무에서는 하루만에 개발 완료할 것을 엄청나게 질질 끌면서 개발했다 흑흑




    1. 게시판용 테이블 생성


    먼저 DB가 있어야 게시물을 읽고 쓸테니 DB 생성부터


    CREATE TABLE `myhome`.`note` (

      `sn` VARCHAR(45) NOT NULL,

      `title` VARCHAR(100) NOT NULL,

      `contents` VARCHAR(6000) NOT  NULL,

      `insert_dt` VARCHAR(45) NOT NULL,

      `update_dt` VARCHAR(45) NULL,

      `delete_at` VARCHAR(45) NOT NULL DEFAULT 'N;,

      PRIMARY KEY (`sn`),

      UNIQUE INDEX `sn_UNIQUE` (`sn` ASC));


    글 삭제 시에는 물리 삭제를 하지 않고 논리 삭제만 하도록 'delete_at' 이라는 컬럼을 넣고 기본값은 'N'을 줬다.

    글 작성일자, 수정일자는 데이터 변환 시에 오류가 발생하지 않도록 처리하기 귀찮으니 그냥 VARCHAR 타입으로 지정했다.


    'sn' 이 글번호로써 이 테이블의 주요키 역할을 수행하게 되는데,

    보통 트리거를 써서 처리하지만 나는 insert 할 때 select 서브쿼리를 써서 처리할 생각이므로 트리거는 따로 생성을 안 했다.




    2. 패키지 및 소스 파일 생성


    이제 구조를 잡아서 소스 파일들을 차례로 만들어줘야지!


    처음에는 상세 게시물 조회, 수정, 신규 게시물 작성을 하나의 화면에서 모두 처리하고 

    insert와 update 역시 merge into 쿼리를 써서 한방에 처리하려고 했다.

    그런데 원인을 알 수 없는 파라미터 처리 문제 ㅠㅠㅠ로 인해 마구 삽질하다가 

    그냥 나의 정신건강을 위해 기능별로 별도의 jsp 를 생성해서 구현함...머저리 같은 짓을 했다. 

    혹시라도 이 글을 보고 그대로 따라하시는 분이 있다면 부디 저보다 고차원적으로 구현하시길


    일단 자바 소스가 들어갈 패키지 note를 하나 만들어 주고 그 안에 컨트롤러, 서비스, DAO, VO를 차곡차곡 넣었다.

    common 폴더 밑에는 페이징 처리에 쓰일 VO를 더 만들어줬다. 

    실제로 내가 쓴 건 PagingVO.java 였고, PagingUtil.java 는 다른 분들이 공개해놓은 소스 공부하느라 만들어본 것...

    그래서 자바 소스 패키지 구조는 아래와 같이 변동되었다.




    쿼리를 작성해야 하니 note-mapper.xml 도 만들어서 매퍼 폴더에 넣어주고 

    js, css, jsp 파일도 게시판 용으로 전부 생성했다. 




    3. 개발 환경 수정


    개발하던 중에 내가 jstl 설정을 제대로 안했다는 것을 깨달았다. 

    그래서 급하게 다시 검색.....머리가 나쁘면 손가락이 고생합니다.


    pom.xml 을 열어서 아래 dependency를 추가해주고




    jstl.jar 와 standard.jar 를 다운 받아서 라이브러리에 추가한당

    (다운로드 링크 → http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/)




    4. 화면 소스 작성


    DB에서 가져온 게시물 목록을 뿌려줄 화면을 먼저 만들었다.

    소스는 아래와 같다.



    앞서 만들어둔 메뉴바가 있으니 그걸 그대로 가져와서 목록 조회 화면에도 넣어주고,

    이 게시판의 글은 관리자만이 쓸 수 있게 할 예정이므로 c 태그를 써서 관리자일 경우에만 쓰기 버튼이 보이도록 처리했다. 

    div id="paging" 영역에 들어간 태그들과 가장 하단에 들어간 hidden 타입의 인풋 박스 두개가 페이징 처리에 필요하다.


    jsp는 이 정도에서 구현을 끝내고 가볍게 css를 쪼금씩 수정



    아유 조잡해.....css 겁나게 못하는 사람의 소스가 바로 이런 것

    검색하다보니 예전엔 몰랐던 신기한 셀렉터가 있어서 써봤다. 

    th:first-child + th 라고 선언하면 <th> 태그 중 두번째 순서에 있는 개체가 선택된다. 

    td:first-child + td 도 마찬가지로 2열을 선택한다.


    css 만지는건 재밌지만 내가 잘 모르고 못하니까 금방 짜증이 난다. 

    더군다나 부트스트랩을 쓰니 살짝만 만져도 제법 괜찮은 화면이 나온다. 

    부트스트랩님은 천재시고 저는 똥멍충이 입니다.


    이제 js 파일을 만들어준다.



    ㅠㅠㅠㅠ 내가 상상하던 js 소스는 이게 아니었는데....

    내 예상대로라면 잘 돌아갔어야 하는 기능들이 갑자기 안 먹다보니 짜증 나서 

    계획 없이 마구잡이로 고치기 시작했더니 이렇게 돌아올 수 없는 강을 건넌 소스가 나왔다. 


    처음 화면에 들어와서 문서를 읽고 나면 바로 getNoteList 함수를 실행한다.

    이때 어차피 1페이지를 읽게 될 것이므로 그냥 파라미터도 1을 써서 바로 보내버렸다.

    자세한 설명은 아래에



    만약 ajax의 리턴값으로 List 형태의 게시물 목록을 받게 구현하지 않고

    model.addAttribute() 를 써서 컨트롤러에서 화면단으로 바로 게시물 목록과 페이징 객체를 추가하여 보낸다면 이렇게 안 짜도 될텐데

    굳이~~~ajax의 리턴값으로 게시물 목록과 페이징 객체를 따로 보내다보니 이런 식으로 구현이 되었다.

    이제 페이징 처리 함수를 자세히 보면 아래와 같다.



    그리고 별도의 펑션을 만들어서 뺄까 말까 고민하다가 그냥 냅둔 부분인데

    페이지 블록 클릭 시의 기능은 아래와 같이 처리했다....



    자바 소스는 아래와 같다.

    처음에 생각했던 로직을 그대로 구현할 수 없게 되면서 이상하게 방향을 틀다보니 이렇게 비효율적인 소스가 등장했다...ㅠㅠㅠㅠ

    너무 아쉽지만 리팩토링을 하기에는 내가 너무 지쳐섴ㅋㅋㅋ그리고 이제 편하게 이런거 짤 시간이 없어서 그냥 마무리했음ㅠㅠ




    서비스, DAO는 특별히 다른 처리를 하는 게 없어서 패스...

    쿼리는 아래와 같이 썼다.



     해당 페이지의 첫번째 게시글 번호와 마지막 게시글 번호는 PagingVO 객체 생성 자 안에서 계산해서 만들도록 세팅해뒀다.

     너무 길어지니 페이징 객체와 페이징 처리 로직은 다음 글에 이어서.....


    완성된 게시판의 모습은 이렇다




    댓글

Designed by Tistory.