본문 바로가기
Spring/spring

스프링 2일차 정리

by dyddyd0 2024. 7. 10.

MVC에서의 DataObject

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 오류 발생한다.

Exception : 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;
    }

결과 →

if(rs.next()) 감싼 후 코드실행 결과

예외 메시지 사라진걸 확인할 수 있다.

 

 

 

 

— 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