윈도우) 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());
}
}
}
실행화면 )
글 수정, 삭제, 조회까지 잘 되는 모습이다.
'2024_UIUX 국비 TIL' 카테고리의 다른 글
UIUX _국비과정 0717 [스프링 3대 요소, AOP] (0) | 2024.07.29 |
---|---|
UIUX _국비과정 0716 [스프링 게시판, 사용자 로그인 여부 알리기] (0) | 2024.07.29 |
UIUX _국비과정 0715 [스프링 설치, 구조 알아보기, 스프링 3대 요소] (1) | 2024.07.29 |
UIUX _국비과정 0712 [모델2방식으로 페이스북 로그인 프로세스 구현] (0) | 2024.07.29 |
UIUX _국비과정 0711 [페이스북 로그인] (0) | 2024.07.29 |