DB를 연동하여 Spring boot에 적용시켜보자!
JDBC 기본적인 순서
1. 드라이버 적재
2. 연결
3. sql문 실행
4. 해제
=> 반복적인 작업들은 Spring에서 모듈화하여 제공
프로젝트를 먼저 생성한다
웹에서 사용하기때문에 Spring Web 체크
+ JDBC를 검색하여 JDBC API 체크
현재사용하고있는 DB ( Mysql || Oracle 사용중 )
이번에는 Oracle을 사용하겠습니다
Oralce만 체크하여 사용 할... 예정이였으나
** 오라클은 최신버전이 아니여서 이용이 안되는 이슈가 있다
따로 체크는 하지않고 별도로 버전에 맞는 jar 파일을 넣어서 사용하도록 하겠습니다
사용중인 프로젝트 Libraries에 오라클관련 jar파일을 추가하여 사용!
application.properties에 DB관련 정보를 추가해주어야 합니다!
현재 오라클을 사용하고있으니 오라클에 맞게 정보를 기입
( MySQL을 사용시 마찬가지로 MySQL 관련정보를 기입 )
DB를 이용할 준비가 되었습니다!
( 이클립스 내부에서 오라클을 이용했습니다 )
Member 테이블생성하여 2개의 정보를 저장했습니다
Spring boot로 돌아와서
DB테이블 정보를 받아올 수 있는 DTO를 생성합니다
memberDAO 생성합니다
Point
1. DAO 전용객체화 어노테이션인 @Repository 를 사용해야 좋다는 점
2. jdbcTemlate은 DI ( 의존주입 ) 을 하여 객체화 해야 사용 할 수 있다는 것
3. 기존의 Spring 처럼 RowMapper 클래스를 생성하지 않아도 된다는 점
( 프로젝트 생성시 JDBC API를 체크 했기때문에 Spring boot에서 관리를 해줌 )
Controller를 생성한다
Spring 기존의 방법이였다면 DAO직접 사용하지는 않습니다! **
하지만 실습이기에 편하게 DAO를 사용하도록 하겠습니다
memberList.jsp 를 생성하여 Model에 저장된 datas를 출력해줍니다
URL에 직접 /memberList 를 넣어 Controller로 들어가
저장되어있던 두개의 데이터를 memberList.jsp에 출력하였습니다
좀 더 상세하게 Board를 이용하여 만들어 보겠습니다
오라클에서 BOARD 테이플을 생성하여 테스트글을 하나 넣었습니다!
페이지를 총 3개 만들어 주었습니다!
boardInsert = 글 작성하기 페이지
boardList = 글 목록 페이지
boardOne = 글 상세 페이지
클래스는 총 3개를 추가하였습니다
** IBoardDAO = DAO클래스를 위해만든 인터페이스
BoardDAO = SQL문 관련 로직이 들어갈 클래스
BoardDTO = DB의 정보를 담아줄 DTO 클래스
Controller는 기존의 Controller를 사용했습니다!
( ** 하지만, Controller는 DTO별로 만드는 것이 사용하는데에 용이합니다 )
( Controller 내부에 로직이 Member와 Board가 섞여있으면 불편하기 때문입니다 )
IBoardDAO 인터페이스
구현할 로직은
selectAll = 글 전체보기
selectOne = 글 상세보기
insert = 글 작성하기
delete = 글 삭제하기
** 추가적으로 update도 가능하지만 생략하였습니다!
BoardDTO 클래스
테이블에서 총 4가지의 값을 받아올 수 있기때문에
담아줄 수 있는 DTO 멤버변수를 선언 및 Getter Setter & toSring 해줍니다
BoardDAO 클래스 ( implemets IBoardDAO )
** Point
1. 인터페이스를 만들었기때문에 implements IBoardDAO를 통해 만들었습니다
2. 유지보수 및 가독성을 위해 sql문관련 final String 변수를 위에 작성하였습니다
3. ( ** 오류포함 설명 ) 기존의 String args 배열을 생성하여 ? 값을 배열로 생성하지않고
RowMapper 뒤에 ? 내용을 이어 붙여서 사용했습니다.
ex) 스프링 슈즈 팀 프로젝트(Spring 프로젝트)에서 사용한 DAO입니다
여러개의 ? 값을 args에 담아 quert() 메서드 내부에 RowMapper와 함께 사용했는데
Spring boot 내부에서도 BoardDAO에 Spring때 처럼 args를 이용했을 경우
이 처럼 queryForObject에 밑줄이 생기며 노란줄이 생깁니다
노란색 박스안의 내용을 번역하자면
JdbcTemplate 유형의 queryForObject(String, Object[], RowMapper<BoardDTO>) 메소드는 더 이상 사용되지 않습니다.
이유 ( ** 밑줄이 그 어지더라도 오류없이 사용이 가능하다! )
1. 오래된 문법
2. 대체가능한 문법이 존재
그래서 아래와 같이
?의 값을 RowMapper뒤에 직접 넣는 방법으로 해결하였습니다! => ** ?가 여러개라면 순서에 유의
( 기존의 args를 이용해도 상관은 없지만 밑줄 때문에 좀 찜찜하긴 하다 )
4. insert, update, delete 류는 기존 Spring 때와 동일!
SelectAll 과 SelectOne은 DTO 객체를 반환하여야하기 때문에 RowMapper와 함께 사용했지만
insert, delete, update 류는 기존 Spring 때와 동일합니다!
jdbcTemplate.update() 를 이용하여 사용할 sql문과, ?의 값을 뒤에 줄줄이 붙여주면 됩니다!
DAO를 완성하였기때문에 이를 이용할 Controller를 확인해봅시다!
Controller 내부
마찬가지로 실습을 위해 간단하게 표현하였습니다!
1. / boardList 요청
모든 Board 관련 데이터를 가져와줄 DAO.selectAll 을 사용하고
결과로 나온 List<boardDTO> 값을 Model에 bDatas로 저장한다
이후, 글 전체를 보여줄 페이지 return " boardList " 로 보냄
위 설정이 존재하기 때문에 자동으로 .jsp로 이동한다
2. / selectOneBoard 요청
View에서 보내주는 bid값을 커맨드객체 dto에 자동매핑하여 저장하고
DAO.selectOne을 이용하여 하나의 결과값(BoardDTO)을 dto 객체에 저장
그 값을 Model에 "bData"로 저장하고 boardOne( 상세 페이지 ) 로 return 해준다
3. / boardInsertPage 요청
글쓰기 페이지로 보내줄 수 있도록 전용 요청을 생성하였습니다
WEB-INF 폴더 내부로 들어가면 직접 <a>로는 jsp를 불러올 수 없기 때문에
Controller 요청으로 만 jsp를 불러올 수 있다
4. / boardInsert 요청
View에서 글작성을 위한 제목, 내용, 작성자 데이터를 보내주면
커맨드 객체 dto에 저장되고 그 값을 이용하여 DAO.insert를 실행한다
리턴값은 int값이며 성공시 1, 실패시 0을 반환한다
( 리턴값을 이용하여 실패했을경우 다른페이지로 이동하는 것이 가능할 것이다! )
prefix suffix를 무시하고 보낼수 있도록 redirect : 이용하여
작성이후 모든 게시글목록 데이터를 가지고 게시글페이지로 가는 요청인
/boardList 요청을 return 한다
5. / boardDelete 요청
View에서 삭제하기 버튼을 클릭시 해당하는 게시글 PK 값인 bid를 보내준다
마찬가지로 커맨드 객체 dto에 저장되고 그ㄱ 값을 이용하여 DAO.delete를 실행한다
리턴값을 int값이며 성공시 1, 실패시 0을 반환한다
prefix suffix를 무시하고 보낼수 있도록 forward : 를이용하여
작성이후 모든 게시글목록 데이터를 가지고 게시글페이지로 가는 요청인
/boardList 요청을 return 한다
** redirect : 와 forward : 차이점
원초적인 사용이유 : Viewresolver인 prefix suffix를 무시하고 요청하기 위해
redirect = 새로운 요청이므로 URL이 새로운 요청에 맞춰 나타난다
redirect를 사용하게되면 기존의 요청이 가지고있는 데이터들을 못가져 온다
forward = 기존의 요청에서 요청하는 방법으로 URL에 기존의 요청에 맞춰 나타난다
forward를 사용하게되면 기존의 요청이 가지고있는 데이터를을 가지고 다음 요청으로 가기때문에
데이터를 들고있는 양이 많아지기에 필요할때만 forward로 보내는 것이 좋다
DAO와 Controller 설정이 모두 완료되었으므로 Jsp 내부를 만들어보자
boardList.jsp
모든글을 보여줄수 있는 페이지이다
/ boardList 요청에 의해 Controller에서 "bDatas"로 데이터들을 불러올 수있다
글번호에 <a>태그를 이용하여 /selectOneBoard 요청으로 갈 수 있고
/selectOneBoard ? bid = ${v.bid} 를 이용하여 bid값도 함께 보내준다
( bid값으로 selectOne을 하기 때문에 보내주어야 한다 )
페이지별로 이동할 수 있도록 글쓰기 페이지로 가는 <a>태그 생성
boardInsert.jsp
글 작성하는 페이지입니다
form 태그를 이용하여 /boardInsert 요청을 하여 Cotroller에 정보를 보내 로직을 실행
<a> 글 목록으로 태그를 생성하여 다시 뒤로 돌아갈 수 있도록 만듬
마찬가지로 /boardList 요청을 이용하여 Cotroller로직을 실행 한 후 boardList.jsp로 이동함
** 작성하기 클릭시 / boardInsert 요청이 실행됩니다
요청의 리턴값은 retrun redirect : / boardList 입니다
( ** ORDER BY BID 설정을 하지않아서 이상한 위치에 글이 생성되었음 )
URL이 새로운 요청인 / boardList 의 URL이 나타나게 됩니다
boardOne.jsp
게시글 상세페이지 입니다
bid를 가지고 요청한 DB데이터를 가지고와서 출력해주는 페이지입니다
여기에선 해당 글을 삭제할 수 있고, 다시 글 목록으로 돌아갈 수 있습니다!
위 insert에서 방금 작성한 5번글을 삭제해 보았습니다
** 삭제하기 클릭시 / boardDelete 요청이 실행됩니다
요청의 리턴값은 retrun foward : / boardList 입니다
URL이 기존 Delete요청 URL이 유지가 되는 것을 확인 할 수 있습니다!
이 글을 통해 기존에 Spring에서 만들었던 팀 프로젝트를 이관작업을 할 수 있을 것입니다!
'Spring boot' 카테고리의 다른 글
[ Spring Boot ] 트랜잭션 (0) | 2022.11.01 |
---|---|
[ Spring boot ] Validator ( 유효성 검사 ) (0) | 2022.10.26 |
[ Spring Boot ] 부트 웹 기초 (0) | 2022.10.25 |
[ Spring boot ] 의존 주입 (0) | 2022.10.24 |
[ Spring Boot ] 다운로드 및 설정 (0) | 2022.10.24 |