윈도우) alt + shift + s + v 누르면 오버라이딩

 

 

빈을 등록하는 방식, 어노테이션, 의존 주입에 대해 배웠다.

 

MVC를 기준으로 어노테이션 설명

💡 C (클라이언트)→ F.C (프레젠테이션) → M (모델) → DB

 M 에는 서비스(비즈니스 계층) + DAO(퍼시스던트 계층) 포함

 

클라이언트 →  프레젠테이션 → 비즈니스계층 → 퍼시스던트계층

@Component    @Controller     @Service      @Repository

 

 

어노테이션의 bean 등록

 

@Component : 일반 클래스

@Controller : 사용자의 요청을 처리 ( xxxController )

@Service : 비즈니스 로직 ( xxxServicelmpl )

@Repository : 데이터 베이스 처리 ( xxxDAO )

 

Service 계층은 인터페이스가 클래스를 상속받는 구조 → 확장성 때문

 

스프링을 배울 때는 단순히 코딩을 따라 쳐서 결과가 나온 게 중요한 게 아니라 구조를 이해해야 한다. 어떤 코드가 어디서 쓰이는지 알아야 개발을 할 수 있음.

 

데이터 베이스에 연결해야 하기 때문에 DB 세팅을 해야 한다.

프로젝트의 build path 에 들어가서 ojdbc6를 연결한다. 맥에서는 11로 해야한다.

 

💡 윈도우에서 파일이 있는 경로 : C:\app\ITSC\product\11.2.0\dbhome_1\jdbc\lib

 

이렇게 추가해주고 apply and close를 하면 레퍼런스 러이브러리에 ojdbc6이 추가되어 있다.

sql 디벨로퍼로 넘어와서 데이터를 처리할 테이블을 만들어준다.

 

scott 계정 )

create table board(
seq number(5) primary key,
title varchar2(200),
writer varchar2(20),
content varchar2(2000),
regdate date DEFAULT sysdate,
cnt number(5) DEFAULT 0
);

데이터베이스에 연결되기 위해 DAO/VO를 생성해야한다.

다시 스프링에서 만들어주기.

 


그 전에 롬북 설치

 

터미널에서 )

C:\Users\ITSC>cd\

C:\>java -jar lombok.jar

STS 실행하는 경로에 롬북을 설치한다.

 

롬북을 배포하기 위해 maven에 들어가 <dependency> 부분을 긁어 pom.xml에 넣는다.

 

이 부분에 넣어줬다.

 


 

여기까지 하고 jdbc 환경설정을 위해 JDBCUtil.java 파일을 만들었다.

 

 

JDBCUtil.java

package com.springbook.biz.common;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Connection;

public class JDBCUtil {

	// JDBC 홤경설정
	// DB 연결
	public static Connection getConnection() {

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1522:orcl1", "scott", "tiger");
		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;

	}

	// DB 연결 끊기
	public static void close(PreparedStatement stmt, Connection conn) {
		if (stmt != null) {
			try {
				if (!stmt.isClosed())
					stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				stmt = null;
			}
		}

		if (conn != null) {
			try {
				if (!conn.isClosed())
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				conn = null;
			}
		}
	}

	public static void close(ResultSet rs, PreparedStatement stmt, Connection conn) {
		if (rs != null) {
			try {
				if (!rs.isClosed())
					rs.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				rs = null;
			}
		}

		if (stmt != null) {
			try {
				if (!stmt.isClosed())
					stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				stmt = null;
			}
		}

		if (conn != null) {
			try {
				if (!conn.isClosed())
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				conn = null;
			}
		}
	}

}

 

 


 

인터페이스를 상속 받는 클래스 만드는 방법 )

인터페이스 add를 누르고 상속하려는 인터페이스를 선택한다.

 


 

 

BoardVO.java

package com.springbook.biz.board;

import java.util.Date;

public class BoardVO {
	private int seq;
	private String title;
	private String writer;
	private String content;
	private Date regDate;
	
	public int getSeq() {
		return seq;
	}
	public void setSeq(int seq) {
		this.seq = seq;
	}
	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 Date getRegDate() {
		return regDate;
	}
	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}
	public int getCnt() {
		return cnt;
	}
	public void setCnt(int cnt) {
		this.cnt = cnt;
	}
	private int cnt;

	@Override
	public String toString() {
		return "BoardVO [seq=" + seq + ", title=" + title + ", writer=" + writer + ", content=" + content + ", regDate="
				+ regDate + ", cnt=" + cnt + "]";
	}
}

 

BoardService.java (인터페이스)

package com.springbook.biz.board;

import java.util.List;

public interface BoardService {
	// crud 
	
	// 글 등록
	void insertBoard(BoardVO vo);
	
	// 글 수정 
	void updateBoard(BoardVO vo);

	// 글 삭제
	void deleteBoard(BoardVO vo);
	
	// 글 상세조회
	BoardVO getBoard(BoardVO vo);
	
	// 글 목록 조회
	List<BoardVO> getBoardList(BoardVO vo);
}

 

BoardDAO.java

package com.springbook.biz.board.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.common.JDBCUtil;

@Repository("boardDAO")
public class BoardDAO {
	private Connection conn = null;
	private PreparedStatement stmt = null;
	private ResultSet rs = null;

	// SQL 명령어

	// 상수형태로 만들어 두었다.
	private final String BOARD_INSERT = " insert into board(seq, title, writer, content) values "
			+ " ((select nvl(max(seq),0) + 1 from board), ?, ?, ?)";

	private final String BOARD_UPDATE = "update board set title=?, content=? where seq=?";
	private final String BOARD_DELETE = "delete board where seq=?";
	private final String BOARD_GET = "select * from board where seq=?";
	private final String BOARD_LIST = "select * from board order by seq desc";

	// 글 등록
	public void insertBoard(BoardVO vo) {
		System.out.println("===> JDBC로 insertBoard() 기능 처리");
		try {

			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_INSERT);
			stmt.setString(1, vo.getTitle());
			stmt.setString(2, vo.getWriter());
			stmt.setString(3, vo.getContent());
			stmt.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	// 글 수정

	// 글 삭제

	// 글 상세 조회

	// 글 목록 조회
	public List<BoardVO> getBoardList(BoardVO vo) {
		System.out.println("==> JDBC로 getBoardList() 기능 처리");

		List<BoardVO> boardlist = new ArrayList<>();

		try {

			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_LIST);
			rs = stmt.executeQuery();

			while (rs.next()) {
				BoardVO board = new BoardVO();
				board.setSeq(rs.getInt("SEQ"));
				board.setTitle(rs.getString("TITLE"));
				board.setWriter(rs.getString("WRITER"));
				board.setContent(rs.getString("CONTENT"));
				board.setRegDate(rs.getDate("REGDATE"));
				board.setCnt(rs.getInt("CNT"));

				boardlist.add(board);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}

		return boardlist;
	}

}

 

BoardServiceImpl.java

package com.springbook.biz.board.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.springbook.biz.board.BoardService;
import com.springbook.biz.board.BoardVO;

@Service("boardService")
public class BoardServiceImpl implements BoardService {

	// boardDAO를 의존 주입해야 한다.
	@Autowired
	private BoardDAO boardDAO;

	@Override
	public void insertBoard(BoardVO vo) {
		// @Autowired를 했기 때문에 사용가능, @Autowired로 객체를 생성한거다.
		boardDAO.insertBoard(vo);

	}

	@Override
	public void updateBoard(BoardVO vo) {

	}

	@Override
	public void deleteBoard(BoardVO vo) {

	}

	@Override
	public BoardVO getBoard(BoardVO vo) {

		return null;
	}

	@Override
	public List<BoardVO> getBoardList(BoardVO vo) {

		return boardDAO.getBoardList(vo);
	}

}

 

applicationContext.xml → 패키지를 스캔할 수 있도록 패키지명 적어주기

<?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: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.3.xsd">

  <!-- 패키지를 스캔해준다. 다 해주는 것은 아니고 표시되어진 클래스만 스캔해준다 -> 이것이 어노테이션 -->
	<context:component-scan base-package="com.springbook.biz"></context:component-scan>
	

</beans>

 

BoardServiceClient.java (실행할 파일)

package com.springbook.biz.board;

import java.util.List;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class BoardServiceClient {

	public static void main(String[] args) {
		// BoardServiceImpl 가지고 와서 써야한다.
		AbstractApplicationContext container = new GenericXmlApplicationContext("applicationContext.xml");

		BoardService boardService = (BoardService) container.getBean("boardService");

		BoardVO vo = new BoardVO();

		// 글 등록
		vo.setTitle("임시제목");
		vo.setWriter("홍길동");
		vo.setContent("임시내용...");
		boardService.insertBoard(vo);

		// 글 목록 조회

		List<BoardVO> boardList = boardService.getBoardList(vo);
		for (BoardVO board : boardList) {
			System.out.println("-->" + board.toString());
		}
	}

}

여기까지 했을 때 BoardServiceClient.java를 실행하면 DB로 데이터가 넘어가야 한다.

 

 

파일의 구조를 보면 이렇다.

 

한 곳에 몰아넣는 구조도 아니고, 기능이 다른 여러 패키지를 만드는 등 정말 복잡하기 때문에 따라할 때도 집중 해야 한다.

 

기본적인 구조가 잡히면 그 안에 코드를 작성한다.

BoardDAO.java, BoardServiceImpl.java, BoardServiceClient.java 파일에 추가 코드 작업을 했다.

 

 

BoardDAO.java

package com.springbook.biz.board.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.common.JDBCUtil;

import oracle.net.aso.i;
import oracle.net.aso.p;

@Repository("boardDAO")
public class BoardDAO {
	private Connection conn = null;
	private PreparedStatement stmt = null;
	private ResultSet rs = null;

	// SQL 명령어

	// 상수형태로 만들어 두었다.
	private final String BOARD_INSERT = " insert into board(seq, title, writer, content) values "
			+ " ((select nvl(max(seq),0) + 1 from board), ?, ?, ?)";

	private final String BOARD_UPDATE = "update board set title=?, content=? where seq=?";
	private final String BOARD_DELETE = "delete board where seq=?";
	private final String BOARD_GET = "select * from board where seq=?";
	private final String BOARD_LIST = "select * from board order by seq desc";

	// 글 등록
	public void insertBoard(BoardVO vo) {
		System.out.println("===> JDBC로 insertBoard() 기능 처리");
		try {

			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_INSERT);
			stmt.setString(1, vo.getTitle());
			stmt.setString(2, vo.getWriter());
			stmt.setString(3, vo.getContent());
			stmt.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	// 글 수정
	public void updateBoard(BoardVO vo) {
		System.out.println("===> JDBC로 updateBoard() 기능 처리");
		
		try {
			
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_UPDATE);
			stmt.setString(1, vo.getTitle());
			stmt.setString(2, vo.getContent());
			stmt.setInt(3, vo.getSeq());
			stmt.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	// 글 삭제
	public void deleteBoard(BoardVO vo) {
		System.out.println("===> JDBC로 deleteBoard() 기능 처리");
		
		try {
			
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_DELETE);
			stmt.setInt(1, vo.getSeq());
			stmt.executeUpdate();
			
		} catch (Exception e){
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
		
	}

	// 글 상세 조회
	public BoardVO getBoard(BoardVO vo) {
		
		BoardVO board = new BoardVO();
		System.out.println("===> JDBC로 getBoard() 상세 보기  처리");
		
		try {

			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_GET);
			stmt.setInt(1, vo.getSeq());
			rs = stmt.executeQuery();
			
			if (rs.next()) {
				
				board.setSeq(rs.getInt("SEQ"));
				board.setTitle(rs.getString("TITLE"));
				board.setWriter(rs.getString("WRITER"));
				board.setContent(rs.getString("CONTENT"));
				board.setRegDate(rs.getDate("REGDATE"));
				board.setCnt(rs.getInt("CNT"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(rs, stmt, conn);
		}
		
		return board;
	}

	// 글 목록 조회
	public List<BoardVO> getBoardList(BoardVO vo) {
		System.out.println("==> JDBC로 getBoardList() 기능 처리");

		List<BoardVO> boardlist = new ArrayList<>();

		try {

			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_LIST);
			rs = stmt.executeQuery();

			while (rs.next()) {
				BoardVO board = new BoardVO();
				board.setSeq(rs.getInt("SEQ"));
				board.setTitle(rs.getString("TITLE"));
				board.setWriter(rs.getString("WRITER"));
				board.setContent(rs.getString("CONTENT"));
				board.setRegDate(rs.getDate("REGDATE"));
				board.setCnt(rs.getInt("CNT"));

				boardlist.add(board);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}

		return boardlist;
	}

}

 

BoardServiceImpl.java

package com.springbook.biz.board.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.springbook.biz.board.BoardService;
import com.springbook.biz.board.BoardVO;

@Service("boardService")
public class BoardServiceImpl implements BoardService {

	// boardDAO를 의존 주입해야 한다.
	@Autowired
	private BoardDAO boardDAO;

	@Override
	public void insertBoard(BoardVO vo) {
		// @Autowired를 했기 때문에 사용가능, @Autowired로 객체를 생성한거다.
		boardDAO.insertBoard(vo);

	}

	@Override
	public void updateBoard(BoardVO vo) {
		
		boardDAO.updateBoard(vo);
	}

	@Override
	public void deleteBoard(BoardVO vo) {

		boardDAO.deleteBoard(vo);
	}

	@Override
	public BoardVO getBoard(BoardVO vo) {

		return boardDAO.getBoard(vo);
	}

	@Override
	public List<BoardVO> getBoardList(BoardVO vo) {

		return boardDAO.getBoardList(vo);
	}

}

 

BoardServiceClient.java

package com.springbook.biz.board;

import java.util.List;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class BoardServiceClient {

	public static void main(String[] args) {
		// BoardServiceImpl 가지고 와서 써야한다.
		AbstractApplicationContext container = new GenericXmlApplicationContext("applicationContext.xml");

		BoardService boardService = (BoardService) container.getBean("boardService");

		BoardVO vo = new BoardVO();

		// 글 등록
//		vo.setTitle("임시제목");
//		vo.setWriter("홍길동");
//		vo.setContent("임시내용...");
//		boardService.insertBoard(vo);
		
		// 글 상세 조회
//		vo.setSeq(4);
//		BoardVO boardVO = boardService.getBoard(vo);
//		System.out.println(boardVO.toString());
		
		// 글 삭제
//		vo.setSeq(1);
//		boardService.deleteBoard(vo);
		
		// 글 수정
		// 제목, 내용
		vo.setSeq(4);
		vo.setTitle("진정한 제목");
		vo.setContent("진정한 내용...");
		boardService.updateBoard(vo);

		// 글 목록 조회
		List<BoardVO> boardList = boardService.getBoardList(vo);
		for (BoardVO board : boardList) {
			System.out.println("-->" + board.toString());
		}
	}

}

 

실행화면 )

글 수정, 삭제, 조회까지 잘 되는 모습이다.

+ Recent posts