SPRING
[스프링]HTTP프로토콜과 URI를 통한 요청
스프링을 이용해서 개발을 하던 중, 검색이나 정렬등 여러 기능을 사용해서 웹페이지의 내용들을 표시할때, 왜 ? UriComponents와 같은 라이브러리를 사용해서 uri를 만들고 왜 ? 그 조합되어 웹페이지의 주소창에 표시되는 uri에 따라 표시되는 내용이 달라지는지 왜 ? 브라우저 주소창의 URI에 임의로 값을 넣으면 서버단의 결과값을 바꿀 수 있는지 궁금해졌다. bgno(게시판카테고리구분), page(현재페이지), perPageNum(페이지에 표시 할 게시글 개수), searchType(검색타입) , keyword(검색어), sort(최신순,댓글순 등 정렬) 이다. 게시글 목록을 출력로직인 /board/list라는 컨트롤러 매핑 주소값에 대응되는 쿼리(게시글목록)의 where문에 들어가는 내용들이다..
[스프링]게시판 조회수,댓글수 순 정렬과 게시글 10개,20개씩 보기 구현
오늘은 게시판 게시글을 조회수와 댓글수, 최신순으로 정렬기능을 구현하고, 게시글을 10개, 20개, 30개씩 볼 수 있는 기능도 같이 만들어봤다. 이 기능을 어떻게 구현해야할지 생각하던 중, OKKY 사이트의 구현되있는 버튼을 눌러보다가 방법을 찾았다. 이런식으로 게시글 정렬이 url에 따라 변경되고, 이렇게 url이 바뀌면서, 결국 검색,페이징기능과 비슷한 로직이라는 것을 알았다. 먼저 게시글목록을 select하는 쿼리의 정렬부분을 바꿔줘야 한다. 전에 게시글의 댓글수를 목록페이지에서 출력하고, 조회수를 출력하는 부분을 구현할때 댓글수와 조회수를 count하는 로직은 이미 만들어뒀기 때문에 그 부분은 넘어가도록 하겠다. SELECT BNO, TITLE, CONTENT, WRITER, REGDATE, H..
[스프링] 다중 게시판 구현 (CRUD)
이번엔 다중 게시판을 구현해보려고 한다. 순서는 먼저 게시판테이블에 BGNO 라는 게시판 구분용 속성을 추가한다. 게시판 테이블은 여러개 만들지 않고, 하나의 테이블을 사용하는 방식으로 구현하려고 한다. 커뮤니티의 BGNO = 1 , Q&A = 2, 포럼 = 3 이런식으로 그룹을 나눠서 구별한다. 새로운 속성이 추가되고, 게시글을 전부 나눠줘야 하기 때문에, 조회, 삽입, 수정 ,삭제 모두 백과 프론트단을 전부 수정해줘야 한다. 일단 게시판테이블(MP_BOARD)에 BGNO를 추가한다. alter table MP_BOARD add BGNO NUMBER NOT NULL; UPDATE MP_BOARD SET BGNO = 1; 현재 지금 있는 글들의 BGNO를 1로 갱신해준다. MAPPER SELECT BNO..
[스프링]게시판 이전글 다음글 구현
오늘은 이전글 다음글을 구현해보려고 한다. 글 이동은 게시글내용(게시글상세보기) 뷰에서 할 것이므로, 처음에는 bno(게시글PR)로 게시글 구분을 하니, 버튼에 onclick= "location.href='상세페이지링크/bno=${bno -1}'" 로 bno값을 불러와 +1, -1하면 되지 않나...라고 떠올렸지만, 구현해보니 삭제된 글 때문에 문제가 되었다.. 1000번 글에서 이전글을보면 999번으로 가는데 999번글은 삭제해서 페이지가 제대로 나오지 않는다. 그래서 게시물 목록을 만들때 처럼, ROW_NUMBER()로 정렬한 select한 결과를 서브쿼리로 select해서 이전글 다음글을 만들어야하나 생각하다가, 검색을 통해 더 간단한 방법을 찾았다. [속성], LEAD([속성],[이동값],[이동후..
[스프링] ajax 댓글 에디터 및 이미지 삽입 구현
저번글의 에디터 적용을 활용해서 비동기 댓글창에도 에디터를 적용해주고 , 에디터를 이용해서 이미지 삽입 및 서버에 저장이 가능하도록 만들었다. 먼저 댓글작성시 파일첨부를 하면 업로드가 될 수 있도록 만든다. 새로 댓글파일첨부 테이블을 만들어서 댓글로직을 따로 처리할 수도 있지만, 여차피 게시글과 같은 로컬에 저장 할 것이고, 댓글PR인 RNO를 댓글을 구현하면서 VO(getter&setter)로 쉽게 받아올 수 있게 만들어놨기 때문에, 게시글과 같은 파일첨부테이블을 사용한다. 먼저 원래의 파일첨부테이블에 RNO (댓글PR)을 추가해준다. alter table MP_FILE add column RNO number; !! NULL값을 허용해야 한다. (NOT NULL X) SELECT MP_REPLY_SEQ..
[스프링]게시판 글작성 에디터 적용과 파일미리보기,이미지 미리보기
저번글에서 다중첨부파일의 crud 기능을 구현하고 이번엔 글작성페이지의 내용부분에 에디터 적용, 첨부파일 미리보기, 에디터에서 이미지첨부를 위한 컬럼 수정을 해봤습니다. 게시판 글쓰기 중, 내용부분에 에디터를 적용해봤다. 네이버 에디터나 다른 오픈소스 에디터를 적용하려고 해봤으나 부트스트랩 기반으로 프론트를 구성한 내 경우는 충돌이 심해 적용방법은 간단하지만 제대로 먹히질 않았다.. 그 와중에 summernote 에디터의 lite 버전을 사용하면 충돌없이 사용할 수 있는 것을 확인했다. 해당 코드를 body안에 추가해준다 (본인은 폼태그 뒤쪽에 넣어줌) 다른 폴더를 넣어줄 필요 없이 위쪽의 cdn코드를 넣어주고 아래의 스크립트 코드를 넣어준다. 그 후 에디터를 넣고 싶은 위치에 연결시켜주면 된다. $('..
[스프링] 첨부파일 다중파일 구현, 수정,삭제 로직의 설명(4)
이부분은 꽤 복잡해서 뒤쪽에 전체적인 흐름을 적어놨습니다.. 궁금하신분은 한번 읽어보시고 글을 읽는 것을 추천해드립니다. Mapper에 추가 UPDATE MP_FILE SET DEL_GB = 'Y' WHERE FILE_NO = #{FILE_NO} update문이지만 삭제여부를 판별하는 DEL_GB로 기본값인 'N'을 Y로 바꿔서 화면에 표시가 되지 않도록 한다. 데이터베이스에는 그대로 남아있다. 데이터베이스까지 아예 삭제하고싶다면 delete문을 이용해서 FILE_NO를 이용해 삭제하는 방식을 사용하면 되겠다. ex) delete from MP_FILE where FILE_NO = #{FILE_NO} 파라미터를 받아오는 방식은 동일하니 어렵지 않다. 이번글에선 다중첨부파일과 게시글 수정, 삭제를 구현하는..
[스프링]게시판 첨부파일 다운로드 (3)
mapper 작성 SELECT STORED_FILE_NAME, ORG_FILE_NAME FROM MP_FILE WHERE FILE_NO = #{FILE_NO} 파일번호를 기준으로 파일테이블의 파일이름을 검색합니다. function fn_fileDown(fileNo){ var formObj = $("form[name='readForm']"); $("#FILE_NO").attr("value", fileNo); formObj.attr("action", "/board/fileDown"); formObj.submit(); } 다운로드를 요청하는 게시글 상세페이지 뷰의 script 태그 사이에 해당 함수를 넣어준다. 전 포스팅에서 만들어놓은 onclick 함수와 input hidden태그를 사용해서, 다운로드를 실..
[스프링] 게시글 첨부파일 조회 구현 설명(select) (2)
SELECT FILE_NO, ORG_FILE_NAME, ROUND(FILE_SIZE/1024,1) AS FILE_SIZE FROM MP_FILE WHERE BNO = #{BNO} AND DEL_GB = 'N' ORDER BY FILE_NO ASC 먼저 Mapper를 작성해준다. 필요한 파라미터는 BNO(게시글 PR)이기 때문에 파라미터 타입을 int로 받고, 결과값은 첨부파일의 파라미터인 Map으로 넘긴다. 파일사이즈는 1024당 1로 나누어 kb로 계산하고 삭제여부가 N인 파일을 FILE_NO(파일PR)을 기준으로 오름차순으로 정렬한다. DAO작성 BoardDAO public List selectFileList(int bno) throws Exception; BoardDAOImpl @Override p..
[스프링]게시판 첨부파일 업로드 구현 설명(insert) (1)
오라클,스프링프레임워크 기준입니다. 먼저 파일추가에 필요한 테이블을 추가해준다. CREATE TABLE MP_FILE ( FILE_NO NUMBER, BNO NUMBER NOT NULL, ORG_FILE_NAME VARCHAR2(260) NOT NULL, STORED_FILE_NAME VARCHAR2(36) NOT NULL, FILE_SIZE NUMBER, REGDATE DATE DEFAULT SYSDATE NOT NULL, DEL_GB VARCHAR2(1) DEFAULT 'N' NOT NULL, PRIMARY KEY(FILE_NO) ); CREATE SEQUENCE SEQ_MP_FILE_NO START WITH 1 INCREMENT BY 1 NOMAXVALUE NOCACHE; COMMIT; 첨부파일 기..