코딩 노트

데이터베이스6 - 모듈화 본문

Database

데이터베이스6 - 모듈화

newbyeol 2023. 7. 24. 11:08

JDBC 구조

JDBC - 삭제(Delete)

- 삭제 구문 ▶ delete 테이블 조건 = ?

// 포켓몬스터 정보 삭제 프로그램

//delete pocketmon no = ?

 

//데이터

int no = 5;

 

//DB처리

String sql = "delete pocketmon where no =?";

Object[] data = {no};

 

JdbcTemplate jdbcTemplate = jdbcUtils.getJdbcTemplate();

 

int result = jdbcTemplate.update(sql, data);

System.out.println("result = " + result);

JDBC 도우미 클래스 만들기

- 클래스 이름에 s가 붙으면 도우미 클래스를 뜻한다.
- JDBC의 연결작업을 쉽게 처리할 수 있도록 도와주는 도우미 클래스이다.
    - 매번 만들던 JDBC 도구를 클래스로 만드는 것

public class jdbcUtils {

//연결 정보를 상수로 저장

public static final String driver = "oracle.jdbc.OracleDriver";

public static final String url = "jdbc:oracle:thin:@localhost:1521:xe";

public static final String username = "C##KH";

public static final String password = "KH";

 

//실행도구 생성 메소드

public static JdbcTemplate getJdbcTemplate() {

DriverManagerDataSource dataSource = new DriverManagerDataSource();

dataSource.setDriverClassName(driver);

dataSource.setUrl(url);

dataSource.setUsername(username);

dataSource.setPassword(password);

 

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

return jdbcTemplate;

}

}

JDBC - 조회(Select)

- 테이블을 조회한 결과를 결과집합(ResultSet)이라고 한다.

- 두 가지 준비물이 필요하다.

- 첫 번째는 조회 결과 중 한 줄을 담을 객체(DTO)

- 두 번째는 조회 결과를 DTO에 옮겨 담는 방법을 가진 객체(Mapper)

//기본 조회는 홀더(?)가 없다. 그러므로 미리 준비해놓을 데이터가 없다. (ex. Object[] data = {};)

String sql = "select * from pocketmon order by no asc"; //기왕이면 정렬

 

PocketmonMapper mapper = new PocketmonMapper();

 

JdbcTemplate jdbcTemplate = jdbcUtils.getJdbcTemplate();

 

List<PocketmonDto> list = jdbcTemplate.query(sql, mapper);

 

System.out.println("조회 결과: " + list.size());

//리스트는 반복문 가능

for(PocketmonDto dto : list) {

System.out.println(dto);

}

DTO 클래스

- 멤버 필드, 기본 생성자, setter/getter 메소드, toString

- 데이터베이스의 한 줄을 그대로 옮겨담기 위한 자바 Wrapper(포장) 클래스이다.

- 하나의 객체 정보이고 테이블 당 최소 한 개가 있어야 한다.

- Data Transfer Object. 데이터 변환용 객체(포장 상자)이다.

- 필드는 데이터베이스의 컬럼과 동일하게 작성한다.

- 기본 생성자와 setter/getter 메소드를 추가한다.

-  toString() 재정의를 한다.

public class PocketmonDto {

//필드는 데이터베이스의 컬럼과 동일하게 작성

private int no;

private String name;

private String type;

 

//기본 생성자와 setter/getter 메소드를 추가, toString() 재정의

public PocketmonDto() {

super();

}

 

public int getNo() {

return no;

}

 

public void setNo(int no) {

this.no = no;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public String getType() {

return type;

}

 

public void setType(String type) {

this.type = type;

}

 

 

@Override

public String toString() {

return "PocketmonDto [no=" + no + ", name=" + name + ", type=" + type + "]";

}

 

}

(Q1) 게시판(Board) 테이블 DTO 클래스

public class BoardDto {

private int boardNo;

private String boardTitle;

private String boardContent;

private String boardWriter;

private int boardReadcount;

 

public BoardDto() {

super();

}

 

public int getBoardNo() {

return boardNo;

}

public void setBoardNo(int boardNo) {

this.boardNo = boardNo;

}

public String getBoardTitle() {

return boardTitle;

}

public void setBoardTitle(String boardTitle) {

this.boardTitle = boardTitle;

}

public String getBoardContent() {

return boardContent;

}

public void setBoardContent(String boardContent) {

this.boardContent = boardContent;

}

public String getBoardWriter() {

return boardWriter;

}

public void setBoardWriter(String boardWriter) {

this.boardWriter = boardWriter;

}

public int getBoardReadcount() {

return boardReadcount;

}

public void setBoardReadcount(int boardReadcount) {

this.boardReadcount = boardReadcount;

}

@Override

public String toString() {

return "BoardDto [boardNo=" + boardNo + ", boardTitle=" + boardTitle + ", boardContent=" + boardContent

+ ", boardWriter=" + boardWriter + ", boardReadcount=" + boardReadcount + "]";

}

Mapper 클래스

- 테이블의 조회 결과를 DTO로 옮기는 방법을 적은 객체이다.

- Select에서만 필요하며 테이블 당 최소 1개 이상이 필요하다.

- Spring JDBC에서 제공받은 RowMapper 클래스를 상속 받아서 Mapper를 이용하여 자동변환을 수행한다.

- 데이터베이스 조회결과(ResultSet)를 어떻게 PoketmonDto에 넣어야 하는지 알려주기 위한 클래스이다.

- 1대 1로 변환 시켜주는 것이다.

- ex. 어디에 있는 걸 어디에 담아라...

public class PocketmonMapper implements RowMapper<PocketmonDto>{

//변환 메소드

//- ResultSet은 데이터베이스에서 조회된 결과물을 의미

//- idx는 현재 변환 중인 회차를 의미

 

@Override

public PocketmonDto mapRow(ResultSet rs, int idx) throws SQLException {

PocketmonDto dto = new PocketmonDto();

// dto.setNo(rs의 no 컬럼에 있는 값;

dto.setNo(rs.getInt("no"));

// dto,setName(rs의 name 컬럼에 있는 값);

dto.setName(rs.getString("name")); //name에 있는 것을 String 형태로 꺼내서 넣어라

// dto.setType(rs의 type 컬럼에 있는 값);

dto.setType(rs.getString("type"));

return dto;

}

 

}

(Q1) 게시판(Board) Mapper 클래스

public class BoardMapper implements RowMapper<BoardDto> {

 

@Override

public BoardDto mapRow(ResultSet rs, int idx) throws SQLException {

BoardDto dto = new BoardDto();

dto.setBoardNo(rs.getInt("board_no"));

dto.setBoardTitle(rs.getString("board_title"));

dto.setBoardContent(rs.getString("board_content"));

dto.setBoardWriter(rs.getString("board_writer"));

dto.setBoardReadcount(rs.getInt("board_readcount"));

 

return dto;

}

(Q1) 게시판(Board) 테이블 정보 조회 후 출력

//게시판 테이블(Board) 정보 조회 후 출력

//- 준비물 : BoardDto, BoardMapper

 

//게시글은 나중에 쓴 게 먼저 나오기 때문에 desc

String sql = "select * from board order by board_no desc";

 

BoardMapper mapper = new BoardMapper();

JdbcTemplate jdbcTemplate = jdbcUtils.getJdbcTemplate();

List<BoardDto> list = jdbcTemplate.query(sql, mapper);

 

if(list.isEmpty()) {

//if(list.size() == 0) {

System.out.println("게시글이 존재하지 않습니다");

} else {

for(BoardDto dto : list) {

System.out.println(dto); //dto.toString()

//System.out.println(dto.getBoardTitle()); //제목만 찍겠다

}

}

+ 검색

//게시판 테이블 검색

//- 준비물 : BoardDto, BoardMapper

 

//게시글은 나중에 쓴 게 먼저 나오기 때문에 desc

 

String keyword = "테스트";

 

String sql = "select * from board "

+ "where instr(board_title, ?) > 0"

+ "order by board_no desc";

Object[] data = {keyword};

 

BoardMapper mapper = new BoardMapper();

JdbcTemplate jdbcTemplate = jdbcUtils.getJdbcTemplate();

List<BoardDto> list = jdbcTemplate.query(sql, mapper, data);

 

if(list.isEmpty()) {

//if(list.size() == 0) {

System.out.println("게시글이 존재하지 않습니다");

} else {

for(BoardDto dto : list) {

System.out.println(dto); //dto.toString()

//System.out.println(dto.getBoardTitle()); //제목만 찍겠다

}

}

(Q) 로그인 프로그램-

- SQL구문 : select * from member where member_id = ? (권장)
- SQL구문 : select * from member where member_id = ? and member_pw = ? (권장하지 않음)
- Primary key로 항목을 조회하는 것을 '단일조회'라고 한다.
- 모든 테이블은 단일 조회가 가능해야 한다.
- 단일 조회는 결과가 없거나 한 개이다.

//데이터

String memberId ="testuser1";

String memberPw = "Testuset1!";

//DB처리

String sql = "select * from member where member_id = ?";

Object[] data = {memberId};

MemberMapper mapper = new MemberMapper();

JdbcTemplate jdbcTemplate = JdbcUtils.getJdbcTemplate();

List<MemberDto> list = jdbcTemplate.query(sql, mapper, data);

//list.size() == 0 or 1 //왜? 조건이 애초에 primary key니까

 

// MemberDto dto;

// if(list.isEmpty()) {

// dto = null;

// } else {

// dto = list.get(0);

// }

MemberDto dto = list.isEmpty() ? null : list.get(0); //3항 연산자(if문 축소)

 

// System.out.println(dto);

// boolean isLogin = dto가 null이 아니면서 dto의 비밀번호와 사용자 비밀번호가 일치하는가?

//비밀번호를 자바에서 비교하도록 구현해야 한다.

boolean isLogin = dto != null && dto.getMemberPw().equals(memberPw);

System.out.println(isLogin);

모듈화(Java Beans 패턴)

- 'DAO'와 'DTO'를 이용하여 코드를 단순명료하게 바꾸는 개발방법론

DAO 클래스

- 데이터베이스 작업을 처리하기 위한 객체이다.

- Data Access Object. DB 담당 처리반 

- 테이블 당 1개이다.
- 내가 뭔가를 주문했을 때 가지고 오는 게 목적(데이터 베이스를 접속하는)이다.
- 해당 테이블에 필요한 기능(주요 작업)들을 '메소드'로 구현한다.
- 기본적으로 C(등록), R(목록), R(상세), U(수정), D(삭제)가 필요하다.

- C/insert R/selectList R/selectOne U/update D/delete

    그 외 기능은 자율적으로 이해하기 쉽게 작명한다.

public class PocketmonDao {

//C(등록) 메소드

public void insert(int no, String name, String type) {

String sql = "insert into pocketmon(no, name, type) "

+ "values(?, ?, ?)";

 

Object[] data = {no, name, type};

JdbcTemplate jdbcTemplate = JdbcUtils.getJdbcTemplate();

jdbcTemplate.update(sql, data);

}

 

//바람직한 형태의 등록 메소드

public void insert(PocketmonDto dto) {

String sql = "insert into pocketmon(no, name, type) "

+ "values(?, ?, ?)";

 

Object[] data = {dto.getNo(), dto.getName(), dto.getType()};

JdbcTemplate jdbcTemplate = JdbcUtils.getJdbcTemplate();

jdbcTemplate.update(sql, data);

}

}

포켓몬스터 등록 메인 클래스(이런 식으로 구현)

public static void main(String[] args) {

PocketmonDto dto = new PocketmonDto();

PocketmonDao dao = new PocketmonDao();

dao.insert(dto);

System.out.println("등록 완료!");

}

 

(Q) 도서 등록 프로그램 최종형태

public class Test03 {

 

public static void main(String[] args) {

//도서 등록 프로그램

//데이터 - DTO

BookDto dto = new BookDto();

 

dto.setBookTitle("Harry Potter 1");

dto.setBookAuthor("J.K. Rowling");

dto.setBookPublicationDate("2001-06-26");

dto.setBookPrice((float) 19.99);

dto.setBookPublisher("Scholastic");

dto.setBookPageCount(320);

dto.setBookGenre("Fantasy");

 

//DB처리

BookDao dao = new BookDao();

dao.insert(dto);

 

System.out.println("등록 완료");

}

 

}

public class BookDao {

public void insert(BookDto dto) {

String sql = "insert into book("

+ "book_id, book_title, book_author, book_publication_date, "

+ "book_price, book_publisher, book_page_count, "

+ "book_genre) values(book_seq.nextval, ?, ?, ?, ?, ?, ?, ?)";

 

Object[] data = {dto.getBookTitle(), dto.getBookAuthor(),

dto.getBookPublicationDate(), dto.getBookPrice(),

dto.getBookPublisher(), dto.getBookPageCount(),

dto.getBookGenre()};

 

JdbcTemplate jdbcTemplate = JdbcUtils.getJdbcTemplate();

jdbcTemplate.update(sql,data);

 

}

}