코딩 학원 50일차(Spring, Maven, MyBatis)
오늘은 저번주 금요일에 했던 spring 프로젝트 만드는 순서를 되짚어보고 클래식 게시판을 하나 만들어보자고 하셨다.
DAO 쪽에서의 작업 순서는
연결
데이터 확보
sql[미완성]
총괄객체
sql완성
실행&결과처리
일텐데 servlet-context.xml에 등록해놓은 SqlSession이 하나 있기 때문에
이것만 불러와줘도 연결과 데이터확보는 생략이 가능해졌다.
다만 파일업로드 혹은 데이터를 가공해야될 작업이 있다면 데이터 확보는 직접 해주어야 한다.
sql 작업을 위해 mapper.xml과 mapper 인터페이스에 insert를 넣어주는데
CUD 같은 경우 영향받은 데이터의 수이기에 int로 메소드 유형을 만들어야 한다.
R 같은 경우 많은 데이터를 목록 식으로 보여주는 것이라면 List를 이용해야 한다.
select는 값을 가져올 때 어떤 형식으로 받을지 정해주는 것이 resultType이고 값을 넣거나 빼거나 대조 하는 등 DB테이블을 건드는 작업이라면 parameterType을 쓴다.(물론 검색 같은 기능을 구현하기 위해 where과 select가 들어가는 경우 resultType과 parameterType 둘다 들어가는 경우도 있다.)
Jsp 보단 확실히 깔끔하게 쓸 수 있는 것 같다. 짧게 쓰는 만큼 다른 곳에 쓰긴 하지만 말이다.
이 게시판 전체 게시물을 카운트하는 기능을 원래 jsp에서는 홈컨트롤러의 기본생성자로 가져다가 썼었는데 지금은 그렇게 하면 오류가 난다.
JSP : DAO를 static 영역에 만들어서 DAO가 먼저 만들어지고 C가 만들어짐.
SpringMVC : 그저 DAO를 하나 만들 뿐 static영역과는 무관 C가 먼저 만들어지고 xml의 객체들이 만들어진다.
그러니까 사이트를 개시할 때 카운팅하는 것이 아니라 사이트 개시 후 첫 손님이 입장할 때만 세주면된다. boolean 함수 하나 만들어서 처음 접속했을 때만 게시판 수가 카운팅되게 해준다.
게시판 검색 기능과 번호 기능은 추후에 유지보수 가능하게 만들 것이다.
우선 검색할 때의 값을 담을 객체를 하나 만들고
select * from (
select rownum as rn, s_no, s_title, s_date from (
select rownum, s_no, s_title, s_date from SHAREDOC
where s_title like '%'||#{search}||'%' or s_txt like '%'||#{search}||'%'
order by s_date desc))
where rn >= #{start} and rn <= #{end}
페이지 번호 기능은 rownum을 이용하여 정렬하기 위해 이런식으로 sql문을 짜준다음 검색어 값이 들어가기 때문에 mapper.xml 파일에서는 위의 객체 만든 것을 파라메터 타입으로 넣어준다.
기본적인 틀은 같으나 검색어 search는 불러왔을 때 값이 없으면 "" 있으면 그 값이 들어가게 해준다.
그리고 한페이지에 몇개의 게시물을 나타낼지 정하는 perPage 같은 경우에는 추후에 그 값이 바뀔 수 있기 때문에
이렇게 클래스를 만들고
servlet-context.xml에서 객체 생성을 해준다.
처음에 여러 종류의 게시판이 있더라도 BoardPerPage의 멤버변수는 하나로 두고 빈을 생성하는 xml에서 생성을 해주면 되겠다라고 생각 했지만 이러면 Autowired를 할 수 없기 때문에 있는 게시판의 수 만큼 멤버변수를 미리 만들어 두고 생성자가 아닌 setter(property) 방식으로 자바빈을 생성하는게 더 좋은 방법이란 것을 깨달았다.
아무튼 그렇게 만든 자바빈을 DAO에서 Autowired 해주고 값을 불러 int로 형변환하여 담아준다.
그리고 이 페이지를 jsp 쪽에서 쓸 수 있게 하려면 반복문을 통해서 페이지 링크를 뽑아주고 그 페이지 번호를 파라메터로 들고갈 수 있게 해준다.
컨트롤러 쪽에서 이렇게 안 쓰일 것 같았던 @RequestParam 방식을 이용하여 int 값을 받아주고 DAO의 메소드를 부를 때 그 값을 넣어준다.
검색 기능은 내일 다시 해보자고 하셨다.