Spring
[Spring] DB 연결 (MVC패턴)
코딩 수달
2022. 9. 16. 11:23
728x90
반응형
기존 MVC 패턴으로 Board, Member 테이블을 만들어
로그인, 게시물 작성 기능을 Spring에서 구현해볼 예정
1. JDBCUtil
공통적으로 드어갈 로직이기 때문에 common 패키지에 클래스를 생성
package com.kim.biz.common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCUtil {
static final String driverName="oracle.jdbc.driver.OracleDriver";
static final String url="jdbc:oracle:thin:@localhost:1521:xe";
static final String user="kim";
static final String passwd="1234";
public static Connection connect() {
Connection conn=null;
try {
Class.forName(driverName);
conn=DriverManager.getConnection(url, user, passwd);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void disconnect(PreparedStatement pstmt,Connection conn) {
try {
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2. Board 테이블
com.kim.biz.board : BoardVO, BoardService ( 관념적인 것이 담긴 패캐지)
com.kim.biz.board.impl : BoardDAO, BoardServiceimpl ( 구현체가 담긴 패키지) - 실제로 컨테이너에 의해 실행
1) sql
CREATE TABLE BOARD(
BID INT PRIMARY KEY,
TITLE VARCHAR(20) NOT NULL,
WRITER VARCHAR(20) NOT NULL,
CONTENT VARCHAR(100) NOT NULL,
CNT INT DEFAULT 0,
REGDATE DATE DEFAULT SYSDATE
);
INSERT INTO BOARD(BID,TITLE,WRITER,CONTENT) VALUES(1,'제목','관리자','내용');
2) VO
package com.kim.biz.board;
public class BoardVO {
private int bid;
private String title;
private String writer;
private String content;
private int cnt;
private String regdate;
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getCnt() {
return cnt;
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
@Override
public String toString() {
return "BoardVO [bid=" + bid + ", title=" + title + ", writer=" + writer + ", content=" + content + ", cnt="
+ cnt + ", regdate=" + regdate + "]";
}
}
3) DAO
@Component를 상속받는 @Repository 사용
package com.kim.biz.board.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.kim.biz.board.BoardVO;
import com.kim.biz.common.JDBCUtil;
@Repository("boardDAO")
public class BoardDAO {
private Connection conn;
private PreparedStatement pstmt;
final String sql_selectOne="SELECT * FROM BOARD WHERE BID=?";
final String sql_selectAll="SELECT * FROM BOARD ORDER BY BID DESC";
final String sql_insert="INSERT INTO BOARD(BID,TITLE,WRITER,CONTENT) VALUES((SELECT NVL(MAX(BID),0)+1 FROM BOARD),?,?,?)";
final String sql_update="UPDATE BOARD SET TITLE=?,CONTENT=? WHERE BID=?";
final String sql_delete="DELETE BOARD WHERE BID=?";
void insertBoard(BoardVO vo) {
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_insert);
pstmt.setString(1, vo.getTitle());
pstmt.setString(2, vo.getWriter());
pstmt.setString(3, vo.getContent());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.disconnect(pstmt, conn);
}
}
void updateBoard(BoardVO vo) {
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_update);
pstmt.setString(1, vo.getTitle());
pstmt.setString(2, vo.getContent());
pstmt.setInt(3,vo.getBid());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.disconnect(pstmt, conn);
}
}
void deleteBoard(BoardVO vo) {
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_delete);
pstmt.setInt(1,vo.getBid());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.disconnect(pstmt, conn);
}
}
BoardVO selectOneBoard(BoardVO vo) {
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_selectOne);
pstmt.setInt(1, vo.getBid());
ResultSet rs=pstmt.executeQuery();
if(rs.next()) {
BoardVO data=new BoardVO();
data.setBid(rs.getInt("BID"));
data.setContent(rs.getString("CONTENT"));
data.setTitle(rs.getString("TITLE"));
data.setWriter(rs.getString("WRITER"));
data.setCnt(rs.getInt("CNT"));
data.setRegdate(rs.getString("REGDATE"));
return data;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.disconnect(pstmt, conn);
}
return null;
}
List<BoardVO> selectAllBoard(BoardVO vo) {
List<BoardVO> datas=new ArrayList<BoardVO>();
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_selectAll);
ResultSet rs=pstmt.executeQuery();
while(rs.next()) {
BoardVO data=new BoardVO();
data.setBid(rs.getInt("BID"));
data.setContent(rs.getString("CONTENT"));
data.setTitle(rs.getString("TITLE"));
data.setWriter(rs.getString("WRITER"));
data.setCnt(rs.getInt("CNT"));
data.setRegdate(rs.getString("REGDATE"));
datas.add(data);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.disconnect(pstmt, conn);
}
return datas;
}
}
4. Service
해당 클래스는 model과 view를 연결해주는 controller 역할
package com.kim.biz.board;
import java.util.List;
public interface BoardService {
void insertBoard(BoardVO vo);
void updateBoard(BoardVO vo);
void deleteBoard(BoardVO vo);
BoardVO selectOneBoard(BoardVO vo);
List<BoardVO> selectAllBoard(BoardVO vo);
}
5. BoardServiceimpl
실질적인 수행을 하는 클래스로 BoardDAO의 메서드를 사용하기위해 객체화를 하기위해
@Component를 사용할 수 있지만 이를 상속받은 @Servie를 사용하여 실질적인 것을 수행하는 클래스라는걸 나타냄
package com.kim.biz.board.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.kim.biz.board.BoardService;
import com.kim.biz.board.BoardVO;
@Service("boardService")
public class BoardServiceImpl implements BoardService {
@Autowired
private BoardDAO boardDAO;
@Override
public void insertBoard(BoardVO vo) {
boardDAO.insertBoard(vo);
}
@Override
public void updateBoard(BoardVO vo) {
boardDAO.updateBoard(vo);
}
@Override
public void deleteBoard(BoardVO vo) {
boardDAO.deleteBoard(vo);
}
@Override
public BoardVO selectOneBoard(BoardVO vo) {
return boardDAO.selectOneBoard(vo);
}
@Override
public List<BoardVO> selectAllBoard(BoardVO vo) {
return boardDAO.selectAllBoard(vo);
}
}
6. 설정파일
어노케이션을 사용하기 위해서 설정파일에 하기와 같이 기입
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<context:component-scan base-package="com.kim.biz"/>
</beans>
Member도 Board와 동일
1. sql
CREATE TABLE MEMBER(
MID VARCHAR(20) PRIMARY KEY,
MPW VARCHAR(20) NOT NULL,
NAME VARCHAR(20) NOT NULL,
ROLE VARCHAR(10) NOT NULL
);
INSERT INTO MEMBER VALUES('admin','1234','관리자','ADMIN');
2. VO
package com.kim.biz.member;
public class MemberVO {
private String mid;
private String mpw;
private String name;
private String role;
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getMpw() {
return mpw;
}
public void setMpw(String mpw) {
this.mpw = mpw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
@Override
public String toString() {
return "MemberVO [mid=" + mid + ", mpw=" + mpw + ", name=" + name + ", role=" + role + "]";
}
}
3. DAO
package com.kim.biz.member.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.kim.biz.common.JDBCUtil;
import com.kim.biz.member.MemberVO;
@Repository("memberDAO")
public class MemberDAO {
private Connection conn;
private PreparedStatement pstmt;
final String sql_selectOne="SELECT * FROM MEMBER WHERE MID=? AND MPW=?";
final String sql_selectAll="SELECT * FROM MEMBER";
final String sql_insert="INSERT INTO MEMBER VALUES(?,?,?,?)";
final String sql_update="UPDATE MEMBER SET MPW=? WHERE MID=?";
final String sql_delete="DELETE MEMBER WHERE MID=? AND MPW=?";
void insertMember(MemberVO vo) {
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_insert);
pstmt.setString(1, vo.getMid());
pstmt.setString(2, vo.getMpw());
pstmt.setString(3, vo.getName());
pstmt.setString(4, vo.getRole());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.disconnect(pstmt, conn);
}
}
void deleteMember(MemberVO vo) {
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_delete);
pstmt.setString(1, vo.getMid());
pstmt.setString(2, vo.getMpw());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.disconnect(pstmt, conn);
}
}
void updateMember(MemberVO vo) {
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_update);
pstmt.setString(1, vo.getMpw());
pstmt.setString(2, vo.getMid());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.disconnect(pstmt, conn);
}
}
MemberVO selectOneMember(MemberVO vo) {
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_selectOne);
pstmt.setString(1, vo.getMid());
pstmt.setString(2, vo.getMpw());
ResultSet rs=pstmt.executeQuery();
if(rs.next()) {
MemberVO data=new MemberVO();
data.setMid(rs.getString("MID"));
data.setMpw(rs.getString("MPW"));
data.setName(rs.getString("NAME"));
data.setRole(rs.getString("ROLE"));
return data;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.disconnect(pstmt, conn);
}
return null;
}
List<MemberVO> selectAllMember(MemberVO vo){
List<MemberVO> datas=new ArrayList<MemberVO>();
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_selectAll);
ResultSet rs=pstmt.executeQuery();
while(rs.next()) {
MemberVO data=new MemberVO();
data.setMid(rs.getString("MID"));
data.setMpw(rs.getString("MPW"));
data.setName(rs.getString("NAME"));
data.setRole(rs.getString("ROLE"));
datas.add(data);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.disconnect(pstmt, conn);
}
return datas;
}
}
4. Service
package com.kim.biz.member;
import java.util.List;
public interface MemberService {
void insertMember(MemberVO vo);
void deleteMember(MemberVO vo);
void updateMember(MemberVO vo);
MemberVO selectOneMember(MemberVO vo);
List<MemberVO> selectAllMember(MemberVO vo);
}
5. MemberServiceimpl
package com.kim.biz.member.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.kim.biz.member.MemberService;
import com.kim.biz.member.MemberVO;
@Service("memberService")
public class MemberServiceImpl implements MemberService {
@Autowired // MemberDAO 타입의 객체가 메모리에 있어야지만 DI(의존성 주입) 가능함!
private MemberDAO memberDAO; // 핵심로직을 수행할 객체
@Override
public void insertMember(MemberVO vo) {
memberDAO.insertMember(vo);
}
@Override
public void deleteMember(MemberVO vo) {
memberDAO.deleteMember(vo);
}
@Override
public void updateMember(MemberVO vo) {
memberDAO.updateMember(vo);
}
@Override
public MemberVO selectOneMember(MemberVO vo) {
return memberDAO.selectOneMember(vo);
}
@Override
public List<MemberVO> selectAllMember(MemberVO vo) {
return memberDAO.selectAllMember(vo);
}
}
Client
package test;
import java.util.List;
import java.util.Scanner;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import com.kim.biz.board.BoardService;
import com.kim.biz.board.BoardVO;
import com.kim.biz.member.MemberService;
import com.kim.biz.member.MemberVO;
public class Client {
public static void main(String[] args) {
// Spring 컨테이너를 동작시킬수있도록 코드작성
AbstractApplicationContext factory=new GenericXmlApplicationContext("applicationContext.xml");
BoardService bs=(BoardService)factory.getBean("boardService");
BoardVO vo=new BoardVO();
Scanner sc=new Scanner(System.in);
System.out.print("내용작성 >> ");
String msg=sc.nextLine();
vo.setContent(msg);
vo.setTitle("글 제목");
vo.setWriter("작은 티모");
bs.insertBoard(vo);
List<BoardVO> datas=bs.selectAllBoard(vo);
for(BoardVO v:datas) {
System.out.println(v);
}
MemberService ms=(MemberService)factory.getBean("memberService"); // Lookup == 메모리에서 객체를 "찾는" 요청
System.out.print("아이디 >> ");
String mid=sc.next();
System.out.print("비밀번호 >> ");
String mpw=sc.next();
MemberVO mvo=new MemberVO();
mvo.setMid(mid);
mvo.setMpw(mpw);
mvo=ms.selectOneMember(mvo); // 핵심로직을 수행하려고한다!
if(mvo==null) {
System.out.println("로그인 실패...");
}
else {
System.out.println(mvo.getName()+"님, 안녕하세요! :D");
}
factory.close();
}
}
728x90
반응형