SPRING

[spring] 20AUG21 @Autowired @Service @Repository

worri-pi 2021. 8. 20. 12:50

 

 

환경만들기

 

C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib

외부 라이브러리 등록 완료

 

테이블 생성

 

 

 

src/main/java/com.springbook.biz/BoardVO.java

데이터를 주고받을 포맷이다. Serializable로 설정해주면 데이터 전송 시 조각단위가 아니라 하나의 객체로 보낼 수 있으므로 더 효율적이다.

package com.springbook.biz.board;

import java.sql.Date;

public class BoardVO {
	private int seq;
	private String title;
	private String writer;
	private String content;
	private Date regdate;
	private int cnt;
	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;
	}
	@Override
	public String toString() {
		return "BoardVO [seq=" + seq + ", title=" + title + ", writer=" + writer + ", content=" + content + ", regdate="
				+ regdate + ", cnt=" + cnt + "]";
	}
	
	
}

 

 

src.main/java/com.springbook.biz.common/JDBCUtil.java

 

package com.springbook.biz.common;

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

public class JDBCUtil {
	public static Connection getConnection() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","scott","TIGER");
		}catch(Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static void close(PreparedStatement pstmt, Connection conn) {
		
			try {
				if(pstmt!=null) pstmt.close();
				if(conn!=null) conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
	
	public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) {
		try {
			if(rs!=null) rs.close();
			if(pstmt!=null) pstmt.close();
			if(conn!=null) conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
	}

 

src/main/java/com.springbook.biz.board.impl/BoardDAO.java

package com.springbook.biz.board.impl;

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

import org.springframework.stereotype.Repository;

@Repository("boardDAO") //이제 spring container가 관리
public class BoardDAO {
	
	private Connection conn = null;
	private PreparedStatement stmt = null;
	private ResultSet rs = null;
	
}

 

src/main/java/com.springbook.biz.board/BoardService.java

인터페이스 내부에 메소드 본체를 가질 수 없다. 필요한 메소드 헤더만 정의하고 이를 구현하는 클래스에서 본체를 구현한다. 이러한 인터페이스로 구성 시 확장성과 유연성이 좋아진다. 유지보수가 쉬어지고 이제 이 인터페이스를 구현할 클래스가 필요하다.

package com.springbook.biz.board;

public interface BoardService {
	
	//글등록
	void insertBoard(BoardVO vo);
}

 

 

src/main/java/com.springbook.biz.board.impl/BoardServiceImpl.java

(보통 구현했다라는 의미로 Impl 를 붙인다.) 만들어 두었던 인터페이스를 구현하고 오버라이드를 통해 메소드 본체를 작성한다. 해당 클래스가 Service라는 것을 알리기 위해 어노테이션으로 Service 라 해준다.

new 객체 생성 없이 하기 위해 @Autowired를 써준다. 의존성 주입이라고 한다(Injection)

package com.springbook.biz.board.impl;

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 {
	
	@Autowired
	private BoardDAO boardDAO;
	
	@Override
	public void insertBoard(BoardVO vo) {
		boardDAO.insertBoard(vo);
	}

}

 

 

BoardDAO.java

package com.springbook.biz.board.impl;

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

import org.springframework.stereotype.Repository;

import com.springbook.biz.board.BoardVO;

@Repository("boardDAO") //이제 spring container가 관리
public class BoardDAO {
	
	private Connection conn = null;
	private PreparedStatement stmt = null;
	private ResultSet rs = null;
	
	//글등록
	public void insertBoard(BoardVO vo) {
		
	}
	
}

 

 

src/main/resources/applicationContext.xml

Namespaces에서 context check

<?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>

 

 

BoardDAO.java

package com.springbook.biz.board.impl;

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

import org.springframework.stereotype.Repository;

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

@Repository("boardDAO") //이제 spring container가 관리
public class BoardDAO {
	
	private Connection conn = null;
	private PreparedStatement stmt = null;
	private ResultSet rs = null;
	
	//글등록
	public void insertBoard(BoardVO vo) {
		System.out.println("insertBoard()기능처리");
		String sql = "insert into board1(seq,title,writer,content) values((select nvl(max(seq),0)+1 from board1),?,?,?)";
		
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(sql);
			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);
		}
	}
	
}

 

 

 

 

 

 

 

 

src/test/java/com.springbook.biz.board/BoardServiceClient.java

 

src/test/java/com.springbook.biz.board/BoardServiceClient.java

서비스 호출을 위해 서비스 정보를 가지고 있는 클래스를 선언한다.

 

package com.springbook.biz.board;

import java.util.Scanner;

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

public class BoardServiceClient {

	public static void main(String[] args) {
		AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");

		BoardService boardService = (BoardService)factory.getBean("boardservice");
		
		BoardVO vo = new BoardVO();
		Scanner sc = new Scanner(System.in);
		
		System.out.println("title입력");
		String title = sc.nextLine();
		System.out.println("writer입력");
		String writer = sc.nextLine();
		System.out.println("content입력");
		String content = sc.nextLine();
		
		vo.setTitle(title);
		vo.setWriter(writer);
		vo.setContent(content);
		
		if(vo.getTitle().isBlank()) vo.setTitle("제목");
		if(vo.getWriter().isBlank()) vo.setWriter("뽀로로");
		if(vo.getContent().isBlank()) vo.setContent("노는게 제일 좋아");
		
		boardService.insertBoard(vo);


		factory.close();
	}

}

 

 

728x90