○ Spring _ 실습_게시판 만들기_[1.Repository 구현]
/**
* 게시물 목록요청: /board/list: GET
* 게시물 상세조회요청: /board/content: GET
* 게시글 쓰기 화면요청: /board/write: GET
* 게시글 등록요청: /board/write: POST
* 게시글 삭제요청: /board/delete: GET
* 게시글 수정화면요청: /board/modify: GET
* 게시글 수정요청: /board/modify: POST
*/
만드는 순서
[레파지토리 - 서비스 - 컨트롤러 - jsp]
chap03_02에 만들어 보겠습니다.
먼저 레파지토리 인터페이스
인터페이스의 메서드중 게시물 전체 조회 기능을 하는 메서드를 만드려고 하는데
반환되는 객체를 만들지 않아서 빨간색 불이 들어왔다.
Board 클래스를 만들어야지.
연습용으로 Board 클래스가 있어서 V2를 붙여서 만들었습니다.
게시번호 / 작성자 / 제목 / 내용 / 조회수 / 날짜 의 칼럼을 갖는 테이블
롬복으로 게터/세터/투스트링 하고 Log4j2 도 사용 한다고 명시
클래스를 만들고 인터페이스로 돌아와서 메서드 정의 하기
총 5개의 기능
- 게시물 전체 조회
- 게시물 상세 조회
- 게시글 등록
- 게시글 삭제
- 게시글 수정
레파지토리는 서버와 데이터 베이스를 연결해주는 기능을 한다는 것을 다시 한번 기억 하자.
구현체 클래스 BoardRepositorylmplV2 만들기
구현체에 빈등록을 하여 생성자가 자동으로 생성되어 작동할수 있도록 설정.
sql 을 작성하여 데이터 베이스에 보내는데
그 정보를 서버에서 읽을 수 있도록 하는 과정을 이해하는 것이 쉽지가 않다.
심지어 위에 있는 코드는 람다로 작성 되었다.
sql 문을 JdbcTemplate 의 도움으로 처리를 하는데 query 메서드를 사용 하려면
String 타입의 sql 과 RowMapper가 필요하다.
데이터베이스의 정보를 서버에서 읽을 수 있도록 데이터베이스에서 읽어온 게시물 하나하나의 정보를 board객체에 담아 반환 해야 하는데 이 과정이 쉽게 이해하기 어렵다.
컬럼의 정보를 읽어 어느 BoardV2 필드 어디에 맵핑 할 것인 알려주는 것을 BoardV2 클래스의 생성자에게 위임 하였다.
이렇게 보면 간단해 보이는 코드지만 복잡하다.
3가지 방법을 통해 template.query 코드에 대해 이해해보자.
- 1. 가장 쉬운 방법은 BoardV2RowMapper 클래스를 RowMapper를 구현하는 구현체로 만든다.
구현체 클래스 BoardRepositoryV2 의 findAll 메서드 에서
sql 을 처리해 줄 template.query 는 String sql 과 RowMapper 타입의 매개 변수가 필요하다.
RowMapper를 클래스로 만들어 준다.
RowMapper는 인터페이스이다.
return template.query(sql.toString(), new BoardV2RowMapper() );
->> RowMapper 인터페이스의 구현 클래스를 BoardV2RowMapper 라고 만들었기 때문에 위에 캡처한 코드가 아닌
아래 타이핑해서 쓴 코드로 작성 하고 구현클래스를 완성시켜주면 실행이 된다.
구현 클래스 마무리 하기
RowMapper는 메서드가 하나만 있다.
funtional 메서드? 여튼 람다가 가능하다고 한다.
인터페이스 메서드 오버라이딩 하기
먼저 BoardV2 클래스의 기본 생성자를 만들어주자.
mapRow 메서드는 ResultSet 인터페이스에 의해 데이터베이스의 칼럼별 데이터를 하나씩 가져온다.
데이터 베이스의 행 길이만큼 이를 반복하는 메서드 인데
rs를 통해 BaordV2 필드에 데이터 베이스 정보를 넣어서 객체를 생성하여 리턴 한다.
그러면 template.query가 객체를 리스트에 담아 리턴해준다.
RowMapper 수정 과정
RowMapper 생성자 호출로 수정 완료.
테스트 완료! 이상 무.
--> 2번째 방법 익명 클래스로 간단하게 리팩토링
먼저 BoardV2RowMapper 클래스의 rs를 받아 객체를 생성하는 것을 BoardV2 클래스에 위임하자.
BoardV2RowMapper 클래스에서 ResultSet 으로 데이터 베이스 칼럼의 정보를 추출해
BoardV2 필드를 채워 객체를 생성하는데
ResultSet을 매개변수로 받는 BoardV2생성자를 생성하여
BoardV2 클래스 생성자가 객체 만드는 일을 하도록 위임 하겠다.
templet.query(sql.toString(), new BoardV2RowMapper()) -> new BoardV2(rs)
-> BoardV2에서 객체 생성 [데이터 행의 수 만큼]
생성자에게 데이터베이스를 받아서 객체를 생성하도록 위임.
# 이제 익명 클래스로 간단하게 만들어 보자.
query 메서드에 필요한 매개변수 sql 과 RowMapper 를 넣고
RowMapper의 메서드를 오버라이딩 하여 바로 작성해 준다.
클래스를 새로 만들지 않아서 간편하다.
테스트 해보기
테스트 결과 이상 없다.
-> 3. 마지막 방법 람다로 작성하기.
람다로 코드를 줄였다.
테스트 결과 이상 없다.
==> 번외 : 람다
제네릭 타입을 받은 후 boolean을 반환하는 인터페이스가 있다.
제네릭타입의 리스트와 boolean을 반환하는 인터페이스를 매개변수로 받는
필터링 메서드가 있다.
테스트를 위해
Book 타입의 리스트를 만든 후
위에서 만들어 놓은 필터링 메서드를 활용해보았다.
익명 클래스로 하여 메서드 안에서 인터페이스를 오버라이딩 하는 것을 람다를 쓰면
코드를 깔끔하게 만들 수 있다.
단! 인터페이스의 메서드가 1개일 경우만 가능하다.
==> 여기까지 BoardV2Repositorylmpl 의 5개 메서드 중 게시물 전체 조회 메서드에 관한 설명 이었습니다.
=> 이어서 BoardV2Repositorylmpl 의 메서드를 계속해서 만들어 보도록 하겠습니다.
#2. 게시물 상세조회 메서드
전체조회의 query가 아닌 queryForObject 로 sql문에서 읽어온 데이터를 서버로 읽어오기.
sql 의 ?를 처리해줄 매개변수를 써준다.
=== >>> template.queryForObject(sql, RowMapper, 매개변수)
테스트 통과!
==> 3번째 메서드 게시물 저장 하기
sql문을 작성 하고 JdbcTemplate의 update 메서드를 사용.
update 메서드는 int를 리턴 하는데 처리한 결과의 숫자를 리턴 한다.
update가 올바르게 수행되면 1을 리턴 하므로 1과 같으면 true가 리턴 된다.
테스트 결과 이상 없다.!
=> 4번째 메서드 만들기
## 삭제 기능
테스트 까지 완료 특이사항은 없다.
==> 마지막 5번째 메서드
## 수정 하기
수정 하기 까지 테스트 완료
BoardRepositoryV2 메서드 구현 완료!