
DTO : Data Transfer Object ; 데이터를 전달하기 위한 객체. 로직을 갖지 않는 순수한 데이터 객체(getter, setter 만 가짐) /
MVC 모델 중 Model, View, Controller 중 어느 곳 에도 속하지 않는다.
DAO : Data Access Object ; 데이터 베이스에 접근하는 역할을 하는 객체.
데이터의 CRUD(Create Read Update Delete) (DB에서 Insert Select Update Delete와 매칭됨) 담당한다.
VO : Value Object ; 값 그자체를 표현하는 객체
Entity ; 실제 DB테이블과 매핑되는 클래스. (데이터를 전달하는 클래스가 아님)
if (rs.next()) { // 넥스트가 있으면 넥스트 가져오기
}
로 감싸지 않으면, Befoer start of result set 오류 발생한다.

감싸기 전
→→
감싼 후
public MemberDto getMemberByUsername(String username) {
System.out.println("getMemberByUsername 실행");
MemberDto memberDto = null;
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(GET_MEMBER_BY_USERNAME);
stmt.setString(1, username);
rs = stmt.executeQuery();
if (rs.next()) { // 넥스트가 있으면 넥스트 가져오기
memberDto = new MemberDto();
memberDto.setId(rs.getInt("ID"));
memberDto.setUsername(rs.getString("USERNAME"));
memberDto.setPassword(rs.getString("PASSWORD"));
memberDto.setEmail(rs.getString("EMAIL"));
memberDto.setNickname(rs.getString("NICKNAME"));
memberDto.setTel(rs.getString("TEL"));
}
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
JDBCUtil.close(conn, stmt, rs);
}
System.out.println("getMemberByUsername 실행종료");
return memberDto;
}
결과 →

예외 메시지 사라진걸 확인할 수 있다.
— MemberDao 클래스 전체 코드 —
package com.bit.springboard.dao;
import com.bit.springboard.common.JDBCUtil;
import com.bit.springboard.dto.MemberDto;
import org.springframework.stereotype.Repository;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
// DAO(Data Access Object): 데이터베이스에 직접 접근해서 쿼리를 실행하는 클래스
@Repository
public class MemberDao {
//JDBC 변수들
private Connection conn = null;
private PreparedStatement stmt = null;
private ResultSet rs = null;
// 쿼리문 작성
// 회원가입 쿼리문
private final String JOIN = "INSERT INTO MEMBER(USERNAME, PASSWORD, EMAIL, NICKNAME, TEL) VALUES (?, ?, ?, ?, ?)";
// 모든 회원 목록 조회 쿼리문
private final String GET_MEMBERS = "SELECT ID" +
" , USERNAME" +
" , PASSWORD" +
" , NICKNAME" +
" , EMAIL" +
" , TEL" +
" FROM MEMBER";
// 특정 회원 조회 쿼리문
private final String GET_MEMBER_BY_USERNAME = "SELECT ID" +
" , USERNAME" +
" , PASSWORD" +
" , NICKNAME" +
" , EMAIL" +
" , TEL" +
" FROM MEMBER" +
" WHERE USERNAME = ?";
public void join(MemberDto memberDto) {
// MemberDto 에 담긴 내용을 Member 테이블에 insert
System.out.println("MemberDao join 메서드 실행");
try{
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(JOIN);
// stmt.setInt(1, memberDto.getId()); Auto Increase
stmt.setString(1, memberDto.getUsername());
stmt.setString(2, memberDto.getPassword());
stmt.setString(3, memberDto.getEmail());
stmt.setString(4, memberDto.getNickname());
stmt.setString(5, memberDto.getTel());
stmt.executeUpdate();
} catch (Exception e){
System.out.println(e.getMessage());
} finally {
JDBCUtil.close(conn, stmt);
}
System.out.println("MemberDao join 메서드 실행 종료.");
}
public List<MemberDto> getMembers(){
System.out.println("MemberDao getMembers 실행");
// 리턴 할 MemberDto 목록
List<MemberDto> memberDtoList = new ArrayList<MemberDto>();
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(GET_MEMBERS);
rs = stmt.executeQuery();
while (rs.next()){
MemberDto memberDto = new MemberDto();
memberDto.setId(rs.getInt("ID"));
memberDto.setUsername(rs.getString("USERNAME"));
memberDto.setPassword(rs.getString("PASSWORD"));
memberDto.setEmail(rs.getString("EMAIL"));
memberDto.setNickname(rs.getString("NICKNAME"));
memberDto.setTel(rs.getString("TEL"));
memberDtoList.add(memberDto);
}
} catch (Exception e){
System.out.println(e.getMessage());
} finally {
JDBCUtil.close(conn, stmt, rs);
}
System.out.println("MemberDao getMembers 실행종료");
return memberDtoList;
}
public MemberDto getMemberByUsername(String username) {
System.out.println("getMemberByUsername 실행");
MemberDto memberDto = null;
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(GET_MEMBER_BY_USERNAME);
stmt.setString(1, username);
rs = stmt.executeQuery();
if (rs.next()) { // 넥스트가 있으면 넥스트 가져오기
memberDto = new MemberDto();
memberDto.setId(rs.getInt("ID"));
memberDto.setUsername(rs.getString("USERNAME"));
memberDto.setPassword(rs.getString("PASSWORD"));
memberDto.setEmail(rs.getString("EMAIL"));
memberDto.setNickname(rs.getString("NICKNAME"));
memberDto.setTel(rs.getString("TEL"));
}
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
JDBCUtil.close(conn, stmt, rs);
}
System.out.println("getMemberByUsername 실행종료");
return memberDto;
}
}
— MemberDto 클래스 전체 코드—
package com.bit.springboard.dto;
// DTO(Data Transfer Object): 데이터를 전송하는 객체
// 화면에서 넘어오는 데이터를 받아서 DB 까지 전달하거나
// 컨트롤러에서 화면으로 데이터를 전송할 때 사용하는 객체
// VO(Value Object)랑 쓰임새가 비슷하다.
public class MemberDto {
private int id;
private String username;
private String password;
private String nickname;
private String email;
private String tel;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
@Override
public String toString() {
return "MemberDto{" +
"id=" + id +
", username='" + username + '\\'' +
", password='" + password + '\\'' +
", nickname='" + nickname + '\\'' +
", email='" + email + '\\'' +
", tel='" + tel + '\\'' +
'}';
}
}
— MemberServie 인터페이스 코드 —
package com.bit.springboard.service;
import com.bit.springboard.dto.MemberDto;
import java.util.List;
public interface MemberService {
void join(MemberDto memberDto);
List<MemberDto> getMembers();
MemberDto getMemberByUsername(String username);
}
MemberService 구현체 클래스 코드 —
package com.bit.springboard.service.impl;
import com.bit.springboard.dao.MemberDao;
import com.bit.springboard.dto.MemberDto;
import com.bit.springboard.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
// Service : 추가로 필요한 비즈니스 로직을 작성하는 클래스
@Service
public class MemberServiceImpl implements MemberService {
private MemberDao memberDao;
@Autowired
public MemberServiceImpl(MemberDao memberDao) {
this.memberDao = memberDao;
}
@Override
public void join(MemberDto memberDto) {
// 필요한 로직처리 코드 작성 후 Dao 의 메서드를 호출하여 쿼리 실행한다.
// 회원가입에서 필요한 로직은 ex)패스워드가 들어왔을때의 비밀번호 암호화 로직 등이 있음
memberDao.join(memberDto);
}
@Override
public List<MemberDto> getMembers() {
return memberDao.getMembers();
}
@Override
public MemberDto getMemberByUsername(String username) {
return memberDao.getMemberByUsername(username);
}
// public MemberDto getMemberByUsername2(MemberDto memberDto) {
// return memberDao.getMemberByUsername2(memberDto);
// }
}
— MemberServiceRun 클래스 (실행 부분) 코드 —
package com.bit.springboard.service;
import com.bit.springboard.dto.MemberDto;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MemberServiceRun {
public static void main(String[] args) {
AbstractApplicationContext factory =
new GenericXmlApplicationContext("root-context.xml");
MemberService memberService = factory.getBean("memberServiceImpl", MemberService.class);
MemberDto memberDto = new MemberDto();
// memberDto.setId(1); Auto Increase
memberDto.setUsername("bitcamp1");
memberDto.setPassword("dkdlxl2");
memberDto.setNickname("비트캠프3");
memberDto.setEmail("bitcamp@bit.co.kr");
memberDto.setTel("010-1234-5678");
memberService.join(memberDto);
memberService.getMembers().forEach(System.out::println);
System.out.println(memberService.getMemberByUsername("bitcamp"));
factory.close();
}
}
—추가 정리할 것—
자바 connection, preparedstatement, resultSet
createstatement 와 preparedstatement 차이점 정리하기.
반응형
'Spring > spring' 카테고리의 다른 글
| 스프링 6일차 정리 (0) | 2024.07.17 |
|---|---|
| 스프링 5일차 정리 (0) | 2024.07.16 |
| 스프링 4일차 정리 (0) | 2024.07.14 |
| 스프링 3일차 정리 (0) | 2024.07.11 |
| 스프링 1일차 정리 (0) | 2024.07.09 |