ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Framework] 의존주입(Dependency Injection)
    Spring/MVC 2022. 9. 10. 18:37

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>spring</groupId>
      <artifactId>Sq03</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>SpringEx</name>
      
      <dependencies>
      	<dependency>
      		<groupId>org.springframework</groupId>
      		<artifactId>spring-context</artifactId>
      		<version>4.1.0.RELEASE</version>
      	</dependency>
      </dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<artifactId>maven-compiler-plugin</artifactId>
    				<version>3.1</version>
    				<configuration>
    					<source>1.8</source>
    					<target>1.8</target>
    					<encoding>utf-8</encoding>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    	
    </project>
    interface
    package com.mav.battery;
    
    public interface Battery {
    	public int getBatteryValue();
    }

    com.mav.battery

    package com.mav.battery;
    
    public class ChargeBattery implements Battery {
    
    	@Override
    	public int getBatteryValue() {
    		return 0;
    	}
    	public void charge(int value) {
    	}
    }
    package com.mav.battery;
    
    public class NormalBattery implements Battery{
    
    	@Override
    	public int getBatteryValue() {
    		return 0;
    	}
    }

    com.mav.toy

    package com.mav.toy;
    
    import com.mav.battery.Battery;
    import com.mav.battery.NormalBattery;
    
    public class ElectronicCar {
    	
    	private Battery bat; // 인터페이스 래퍼런스 변수 
    	// NomalBattery or ChargeBattery 인스턴스가 저장될 변수
    	public ElectronicCar()	{
    		// 생성자에서 노멀배터리를 엠변수에 초기값으로 대입하고 시작함
    		bat=new NormalBattery();
    		// 인터페이스 멤버 변수에 battery를 임플리먼트 한 클랫를 대입함
    	}
    }
    // 이 장난감은 배터리가 출시당시 탑재(내장)되서 교체가 불가능한 상태로 판매되는 형태임
    package com.mav.toy;
    
    import com.mav.battery.Battery;
    
    public class ElectronicRadio {
    	
    	private Battery bat;
    	// 생성자에서 배터리가 초기화 되는데 그 초기값이 생성자의 전달인수로 전달되어야 하는 형태
    	public ElectronicRadio(Battery bat) {
    		this.bat=bat;
    	}
    	public void setBattery(Battery battery) {
    		this.bat=battery;
    	} // 추후 배터리를 새로 교체할 수 있는 기능이 있음
    }
    // 구매와 동시에 동봉 또는 별도 구입합 새 배터리를 장착할 수 있는 기능이 있음

    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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    	
    	<bean class="com.mav.battery.NormalBattery"  id="nBattery"></bean>
    	<bean class="com.mav.battery.ChargeBattery"  id="cBattery"></bean>
    	<bean class="com.mav.toy.ElectronicCar"  id="car"></bean>
    	<bean class="com.mav.toy.ElectronicRadio"  id="radio">
    		<constructor-arg ref="cBattery"></constructor-arg><!-- 의존 주입 - 객체 조립 -->
    	</bean>
    <!-- 
    클래스의 생성자가 다른 클래스를 매개변수 갖고 해당 객체가 전달되어야 생성자 실행이 가능하며 이는 클래스가 다른 클래스에 의존하고 있다라고 얘기함. 
    그리고 의존에 해당하는 객체를 위와 같이 constructor-arg를 이용해서 채워주는 것을 의존 주입이라고 말함. 통틀어 객체 조립이라고 표현
    -->
    </beans>

    com.mav

    package com.mav;
    
    import org.springframework.context.support.GenericXmlApplicationContext;
    
    import com.mav.battery.ChargeBattery;
    import com.mav.battery.NormalBattery;
    import com.mav.toy.ElectronicCar;
    import com.mav.toy.ElectronicRadio;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// 일반적인 사용예
    		
    		// 배터리가 장착된 상태로 판매되는 일체형. 객체 생성 하나만으로 사용 가능
    		ElectronicCar carToy1=new ElectronicCar();
    		
    		// ElectronicRadio radioToy=new ElectronicRadio(); ->error
    		// 생성자에 배터리 객체가 전달되어야 매개변수가 있는 생성자가 실행되므로 위는 오류
    		NormalBattery nbatt1=new NormalBattery()	;
    		ChargeBattery cbatt1=new ChargeBattery();
    		ElectronicRadio radioToy1=new ElectronicRadio(nbatt1);
    		// 생성자에 배터리 객체를 전달해주면 정상 실행. 
    		// 이렇게 객체 생성시에 다른 객체의 존재 및 생성자료의 전달 인수 필요한 상태
    		// 객체 생성이 다른 객체에 의존하고 있는 상태 이를 객체 의존이라고 부름
    		// 그리고 필요 객체를 생성자의 전달인수로 넣어주는 것을 의존주입(Dependency Injection)이라고 부름
    		
    		GenericXmlApplicationContext ctx
    		=new GenericXmlApplicationContext("classpath:applicationContext.xml");
    		
    		ElectronicCar carToy2=ctx.getBean("car",ElectronicCar.class);
    		ElectronicRadio radioToy2=ctx.getBean("radio",ElectronicRadio.class);
    		radioToy2.setBattery(nbatt1);
    		// 스프링 프레임워크에서의 클래스 사용이 약간 업그레이드 되어 조금 간편해짐
    	}
    }

    EX

     

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>spring</groupId>
      <artifactId>Sp04</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>SpringEx</name>
      
      <repositories>
      	<repository>
      		<id>oracle</id>
      		<name>ORACLE JDBC Repository</name>
      		<url>http://maven.jahia.org/maven2</url>
      	</repository>
      </repositories>
      
      <dependencies>
      	<dependency>
      		<groupId>org.springframework</groupId>
      		<artifactId>spring-context</artifactId>
      		<version>4.1.0.RELEASE</version>
      	</dependency>
      	<dependency>
    		<groupId>com.oracle</groupId>
    		<artifactId>ojdbc6</artifactId>
    		<version>12.1.0.2</version>
    	</dependency>
      </dependencies>
    	
    	<build>
    		<plugins>
    			<plugin>
    				<artifactId>maven-compiler-plugin</artifactId>
    				<version>3.1</version>
    				<configuration>
    					<source>1.8</source>
    					<target>1.8</target>
    					<encoding>utf-8</encoding>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    	
    </project>

     

    SQL

    drop table student;
    create table student(
    	sNum varchar2(20),
    	sId varchar2(20),
    	sPw varchar2(20),
    	sName varchar2(20),
    	sAge number(3),
    	sGender varchar2(20),
    	sMajor varchar2(80)
    );

     

    Dto

     
    package com.mav.member.dto;
    
    public class Student {
    
    	private String sNum;
    	private String sId;
    	private String sPw;
    	private String sName;
    	private int sAge;
    	private String sGender;
    	private String sMajor;
    	
    	public Student(
    			String sNum, String sId, String sPw, String sName, 
    			int sAge, String sGender, String sMajor) {
    		super();
    		this.sNum = sNum;
    		this.sId = sId;
    		this.sPw = sPw;
    		this.sName = sName;
    		this.sAge = sAge;
    		this.sGender = sGender;
    		this.sMajor = sMajor;
    	}
    	
    	public String getsNum() {
    		return sNum;
    	}
    	public void setsNum(String sNum) {
    		this.sNum = sNum;
    	}
    	public String getsId() {
    		return sId;
    	}
    	public void setsId(String sId) {
    		this.sId = sId;
    	}
    	public String getsPw() {
    		return sPw;
    	}
    	public void setsPw(String sPw) {
    		this.sPw = sPw;
    	}
    	public String getsName() {
    		return sName;
    	}
    	public void setsName(String sName) {
    		this.sName = sName;
    	}
    	public int getsAge() {
    		return sAge;
    	}
    	public void setsAge(int sAge) {
    		this.sAge = sAge;
    	}
    	public String getsGender() {
    		return sGender;
    	}
    	public void setsGender(String sGender) {
    		this.sGender = sGender;
    	}
    	public String getsMajor() {
    		return sMajor;
    	}
    	public void setsMajor(String sMajor) {
    		this.sMajor = sMajor;
    	}
    }

     

    Dao

    package com.mav.member.dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class StudentDao {
    
    	String driver="oracle.jdbc.driver.OracleDriver";
    	String url="jdbc:oracle:thin:@localhost:1521:xe";
    	String id="scott";
    	String pw="tiger";
    	Connection con=null;
    	PreparedStatement pstmt=null;
    	ResultSet rs=null;
    	// 스프링 컨테이너에 넣어서 사용할 예정이므로 싱글턴 코딩은 하지 않음
    	
    	public Connection getConnection()	{
    		Connection con=null;
    		try {
    			Class.forName(driver);
    			con=DriverManager.getConnection(url,id,pw);
    		} catch(ClassNotFoundException e) {e.printStackTrace();
    		} catch(SQLException e) {e.printStackTrace();}
    		return con;
    	}
    	
    	public void close()	{
    		try {
    			if(con!=null) con.close();
    			if(pstmt!=null) pstmt.close();
    			if(rs!=null) rs.close();
    		}catch(SQLException e) {e.printStackTrace();}
    	}
    }
     

     

    student 테이블에 insert 하기

    package com.mav.member.service;
    
    import com.mav.member.dao.StudentDao;
    import com.mav.member.dto.Student;
    
    public class StudentInsertService {
    	
    	private StudentDao sdao;
    	StudentInsertService(StudentDao sdao){
    		this.sdao=sdao;
    	}
    	public void insertStudent(Student std) {
    		sdao.insertStudent(std);
    	}
    }

    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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd">
           
    	<bean class="com.mav.member.dao.StudentDao" id="studentdao"></bean>
    	  
    	<bean class="com.mav.member.service.StudentInsertService" id="insertService">
    		<constructor-arg ref="studentdao"></constructor-arg>
    	</bean>  
    	
    </beans>

    MainClass

    package com.mav.member.main;
    
    import java.util.ArrayList;
    
    import org.springframework.context.support.GenericXmlApplicationContext;
    
    import com.mav.member.dto.Student;
    import com.mav.member.service.StudentInsertService;
    import com.mav.member.service.StudentSelectAllService;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// 기존 방식의 레코드 추가
    //		StudentDao sdao=new StudentDao();
    //		StudentInsertService sis=new StudentInsertServe(sdao);
    //		sis.insertStudent(new Student());
    		
    		// 스프링 컨테이너를 이용한 방법
    		GenericXmlApplicationContext ctx
    		=new GenericXmlApplicationContext("classpath:applicationContext.xml");
    //		Student std=new Student("H39asdfaelu42o23","hippo","94875","barabra",
    //				22,"W","Korean Literature"); // 생성자에 전달인수 전달하여 객체 생성
    		
    		StudentInsertService sis=ctx.getBean("insertService",StudentInsertService.class);
    //		sis.insertStudent(std);
    		
    		String[] sNums= {"H39asdfaelu42o23","H39ilemamca48w9h4","H39lkmn754fghia7","H39plo865cuy8k92",
    				"H39mnbviiaed89q1","H399omjjyv56t3d5","H39ixzaqwg644gj8","H39ymbcsh74thgh2","H39lesvj7544vf89"};
    		String[] sIds= {"hippo","raccoon","elephant","lion","tiger","pig","horse","bird","deer"};
    		String[] sPws= {"94875","15284","48765","28661","60915","30028","29801","28645","28465"};
    		String[] sNames= {"barbara","chris","doris","elva","fiona","holly","jasmin","lena","mellssa"};
    		int[] sAges= {22,20,27,19,21,19,25,22,24};
    		String[] sGenders= {"W","W","M","M","M","W","M","W","W"};
    		String[] sMajors= {"Korean Literature","French Literature","Philosophy","History","Law","Statistics","Computer","Economics","Public Admin"};
    		
    		for(int i=0; i<sNums.length; i++) {
    			Student std=new Student(sNums[i],sIds[i],sPws[i],sNames[i],sAges[i],sGenders[i],sMajors[i]);
    			sis.insertStudent(std);
    		}
    	}
    }
    

    StudentDao에 insertStudent 추가

    public void insertStudent(Student std) {
    		String sql="insert into student(snum, sid, spw, sname, sage, sgender, smajor)"
    				+" values(?,?,?,?,?,?,?)";
    		con=getConnection();
    		try {
    			pstmt=con.prepareStatement(sql);
    			pstmt.setString(1, std.getsNum());
    			pstmt.setString(2, std.getsId());
    			pstmt.setString(3, std.getsPw());
    			pstmt.setString(4, std.getsName());
    			pstmt.setInt(5, std.getsAge());
    			pstmt.setString(6, std.getsGender());
    			pstmt.setString(7, std.getsMajor());
    			pstmt.executeUpdate();
    		} catch(SQLException e) {e.printStackTrace();
    		} finally {close();}
    	}
    MainClass 실행결과 후 sql execute

     

    student 테이블 조회하기

    package com.mav.member.service;
    
    import java.util.ArrayList;
    
    import com.mav.member.dao.StudentDao;
    import com.mav.member.dto.Student;
    
    public class StudentSelectAllService {
    	
    	private StudentDao sdao;
    	StudentSelectAllService(StudentDao sdao){
    		this.sdao=sdao;
    	}
    	public ArrayList<Student> selectAllStudent(){
    		ArrayList<Student> list=null;
    		list=sdao.selectAllStudent();
    		return list;
    	}
    }

    applicationContext.xml에 bean 추가

    <bean class="com.mav.member.service.StudentSelectAllService" id="selectAllService">
    	<constructor-arg ref="studentdao"></constructor-arg>
    </bean>  

    MainClass에 추가

    StudentSelectAllService sas=ctx.getBean("selectAllService",StudentSelectAllService.class);
    // 모든 학생 조회
    ArrayList<Student> list=sas.selectAllStudent();
    for(int i=0; i<list.size(); i++) {
    	System.out.print(" | sNum: "+list.get(i).getsNum()+"\t");
    	System.out.print(" | sId: "+list.get(i).getsId()+"\t");
    	System.out.print(" | sPw: "+list.get(i).getsPw()+"\t");
    	System.out.print(" | sName: "+list.get(i).getsName()+"\t");
    	System.out.print(" | sAge"+list.get(i).getsAge()+"\t");
    	System.out.print(" | sGender: "+list.get(i).getsGender()+"\t");
    	System.out.print(" | sMajor: "+list.get(i).getsMajor()+"\n");
    }

    StudentDao에 selectAllStudent 추가

    public ArrayList<Student> selectAllStudent() {
    	ArrayList<Student> list=new ArrayList<Student>();
    	String sql="select*from student";
    	con=getConnection();
    	try {
    		pstmt=con.prepareStatement(sql);
    		rs=pstmt.executeQuery();
    		while(rs.next()) {
    			Student std=new Student(
    				rs.getString("sNum"),
    				rs.getString("sId"),
    				rs.getString("sPw"),
    				rs.getString("sName"),
    				rs.getInt("sAge"),
    				rs.getString("sGender"),
    				rs.getString("sMajor")
    			); // 생성자 함수를 이용하여 객체 생성
    			list.add(std);
    		}
    	} catch(SQLException e) {e.printStackTrace();
    	} finally {close();}
    	return list;
    }
    MainClass 실행결과
     

     

    아이디로 학생 조회하기

    package com.mav.member.service;
    
    import com.mav.member.dao.StudentDao;
    import com.mav.member.dto.Student;
    
    public class StudentSelectOneService {
    
    	private StudentDao sdao;
    	
    	public StudentSelectOneService(StudentDao sdao){
    		this.sdao=sdao;
    	}
    	
    	public Student selectOneStudent(String sId) {
    		Student std=null;
    		std=sdao.selectOneStudent(sId);
    		return std;
    	}
    }

    applicationContext.xml에 bean 추가

    <bean class="com.mav.member.service.StudentSelectOneService" id="selectOneService">
    	<constructor-arg ref="studentdao"></constructor-arg>
    </bean>  

    StudentDao에 selectOneStudent 생성

    public Student selectOneStudent(String sId) {
    	Student std=null;
    	String sql="select*from student where sId=?";
    	con=getConnection();
    	try {
    		pstmt=con.prepareStatement(sql);
    		pstmt.setString(1, sId);
    		rs=pstmt.executeQuery();
    		while(rs.next()) {
    			std=new Student(
    				rs.getString("sNum"),
    				rs.getString("sId"),
    				rs.getString("sPw"),
    				rs.getString("sName"),
    				rs.getInt("sAge"),
    				rs.getString("sGender"),
    				rs.getString("sMajor")
    			);
    		}
    	} catch(SQLException e) {e.printStackTrace();
    	} finally {close();}
    	return std;
    }

    MainClass에 추가

    Scanner sc=new Scanner(System.in);
    System.out.printf("조회할 학생의 아이디를 입력하세요\n");
    String ids=sc.nextLine();
    
    StudentSelectOneService sos=ctx.getBean("selectOneService",StudentSelectOneService.class	);
    Student std=sos.selectOneStudent(ids);
    
    if(std==null) {
    	System.out.println("조회한 아이디의 학생이 없습니다");
    	return;
    }
    System.out.print(" | sNum: "+std.getsNum()+"\n");
    System.out.print(" | sId: "+std.getsId()+"\n");
    System.out.print(" | sPw: "+std.getsPw()+"\n");
    System.out.print(" | sName: "+std.getsName()+"\n");
    System.out.print(" | sAge"+std.getsAge()+"\n");
    System.out.print(" | sGender: "+std.getsGender()+"\n");
    System.out.print(" | sMajor: "+std.getsMajor()+"\n\n");

     

    MainClass &nbsp;실행결과

     

    아이디로 학생 조회하여 정보 수정하기

    package com.mav.member.service;
    
    import com.mav.member.dao.StudentDao;
    import com.mav.member.dto.Student;
    
    public class StudentUpdateService {
    
    	private StudentDao sdao;
    	public StudentUpdateService(StudentDao sdao){
    		this.sdao=sdao;
    	}
    	public void updateStudent(Student std) {
    		sdao.updateStudent(std);
    	}
    }

    applicationContext.xml에 bean 추가

    <bean class="com.mav.member.service.StudentUpdateService" id="updateService">
    	<constructor-arg ref="studentdao"></constructor-arg>
    </bean

    StudentDao에 updateStudent 생성

    public void updateStudent(Student std) {
    	String sql="update student set sPw=?, sName=?,"
    			+ "sAge=?, sGender=?, sMajor=? where sId=?";
    	con=getConnection();
    	try {
    		pstmt=con.prepareStatement(sql);
    		pstmt.setString(1, std.getsPw());
    		pstmt.setString(2, std.getsName());
    		pstmt.setInt(3, std.getsAge());
    		pstmt.setString(4, std.getsGender());
    		pstmt.setString(5, std.getsMajor());
    		pstmt.setString(6, std.getsId());
    		pstmt.executeUpdate();
    	} catch(SQLException e) {e.printStackTrace();
    	} finally {close();}
    }

    MainClass에 추가

    System.out.printf("수정할 학생의 아이디를 입력하세요: ");
    ids=sc.nextLine();
    std=sos.selectOneStudent(ids);
    if(std==null) {
    	System.out.println("조회한 아이디의 학생이 없습니다");
    	return;
    }
    
    System.out.printf("기존 비밀번호: %s - 수정할 비밀번호를 입력하세요: ",std.getsPw());
    String pw=sc.nextLine();
    if(!pw.equals("")) std.setsPw(pw);
    
    System.out.printf("기존 성명: %s - 수정할 성명을 입력하세요: ",std.getsName());
    String name=sc.nextLine();
    if(!name.equals("")) std.setsName(name);
    
    System.out.printf("기존 나이: %s - 수정할 나이를 입력하세요: ",std.getsAge());
    String age=sc.nextLine();
    if(!age.equals("")) std.setsAge(Integer.parseInt(age));
    
    System.out.printf("기존 성별: %s - 수정할 성별을 입력하세요: ",std.getsGender());
    String gender=sc.nextLine();
    if(!gender.equals("")) std.setsGender(gender);
    
    System.out.printf("기존 전공: %s - 수정할 전공을 입력하세요: ",std.getsMajor());
    String major=sc.nextLine();
    if(!major.equals("")) std.setsMajor(major);
    
    StudentUpdateService us=ctx.getBean("updateService",StudentUpdateService.class);
    us.updateStudent(std);
    
    System.out.print(" | sNum: "+std.getsNum()+"\n");
    System.out.print(" | sId: "+std.getsId()+"\n");
    System.out.print(" | sPw: "+std.getsPw()+"\n");
    System.out.print(" | sName: "+std.getsName()+"\n");
    System.out.print(" | sAge"+std.getsAge()+"\n");
    System.out.print(" | sGender: "+std.getsGender()+"\n");
    System.out.print(" | 
    MainClass 실행결과
     

    DataBase connect

    StudentDao에 DataBaseConnection 정보(driver, url, id, pw)가 null일 경우

    String driver=null;
    String url=null;
    String id=null;
    String pw=null;
    StudentDao(DataBaseConnectionInfo dbconinfo){
    	this.driver=dbconinfo.getDriver();
    	this.url=dbconinfo.getUrl();
    	this.id=dbconinfo.getId();
    	this.pw=dbconinfo.getPw();
    }
    package com.mav.member.dto;
    
    public class DataBaseConnectionInfo {
    	private String url;
    	private String id;
    	private String pw;
    	private String driver;
    	public String getUrl() {
    		return url;
    	}
    	public void setUrl(String url) {
    		this.url = url;
    	}
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getPw() {
    		return pw;
    	}
    	public void setPw(String pw) {
    		this.pw = pw;
    	}
    	public String getDriver() {
    		return driver;
    	}
    	public void setDriver(String driver) {
    		this.driver = driver;
    	}
    }

     

    스프링 컨테이너의 Bean 태그에 property 태그를 이용하여 각 멤버변수에 초기값을 넣어줄 수 있음.

    아래와 같이 property 태그로 멤버변수에 값을 초기화하려면 각 변수의 getter/setter가 필수로 존재해야 함

    <bean class="com.mav.member.dto.DataBaseConnectionInfo" id="dbconinfo1">
    	<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    	<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
      	<property name="id" value="scott"/>
      	<property name="pw" value="tiger"/>
    </bean>
    
      <!--스프링 컨테이너에 저장되는 Bean은 한개의 객체이므로
      다른 내용의 객체가 필요하다면 초기값을 달리해서 또 하나의 Bean을 생성함 -->
      <bean class="com.mav.member.dto.DataBaseConnectionInfo" id="dbconinfo2">
     	<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
     	<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
     	<property name="id" value="system"/>
     	<property name="pw" value="adminuser"/>
     </bean>
    
    <bean class="com.mav.member.dao.StudentDao" id="studentdao">
    	<constructor-arg ref="dbconinfo1"></constructor-arg>
    </bean>
    package com.mav.member.dto;
    
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    public class EMSInformationService {
    
    	private String info;
    	private String copyRight;
    	private String ver;
    	private int sYear;
    	private int sMonth;
    	private int sDay;
    	private int eYear;
    	private int eMonth;
    	private int eDay;
    	private List<String> developers;
    	private Map<String, String> administrators;
    	private Map<String, DataBaseConnectionInfo> dbInfos;
    	
    	public void outputEMSInformation() {
    		System.out.print("\n\n");
    		String devPeriod=sYear+"/"+sMonth+"/"+sDay+" ~ "+eYear+"/"+eMonth+"/"+eDay;
    		System.out.println(info+"("+devPeriod+")"+"\n"+copyRight+"\n"+ver);
    		System.out.println("Developers: "+developers);
    		System.out.println("Administrators: "+administrators);
    		outputDataBaseInfo(); // 아래 메서드 호출
    		System.out.print("\n\n");
    	}
    	
    	public void outputDataBaseInfo() {
    		Set<String> keys=dbInfos.keySet();
    		Iterator<String> iterator=keys.iterator();
    		while(iterator.hasNext()) {
    			String key=iterator.next();
    			DataBaseConnectionInfo info=dbInfos.get(key);
    			System.out.printf("[%s]", key);
    			System.out.print("jdbcUrl"+info.getUrl()+"\t");
    			System.out.print("userId"+info.getId()+"\t");
    			System.out.print("userPw"+info.getPw()+"\t");
    		}
    	}
    	
    	public String getInfo() {
    		return info;
    	}
    	public void setInfo(String info) {
    		this.info = info;
    	}
    	public String getCopyRight() {
    		return copyRight;
    	}
    	public void setCopyRight(String copyRight) {
    		this.copyRight = copyRight;
    	}
    	public String getVer() {
    		return ver;
    	}
    	public void setVer(String ver) {
    		this.ver = ver;
    	}
    	public int getsYear() {
    		return sYear;
    	}
    	public void setsYear(int sYear) {
    		this.sYear = sYear;
    	}
    	public int getsMonth() {
    		return sMonth;
    	}
    	public void setsMonth(int sMonth) {
    		this.sMonth = sMonth;
    	}
    	public int getsDay() {
    		return sDay;
    	}
    	public void setsDay(int sDay) {
    		this.sDay = sDay;
    	}
    	public int geteYear() {
    		return eYear;
    	}
    	public void seteYear(int eYear) {
    		this.eYear = eYear;
    	}
    	public int geteMonth() {
    		return eMonth;
    	}
    	public void seteMonth(int eMonth) {
    		this.eMonth = eMonth;
    	}
    	public int geteDay() {
    		return eDay;
    	}
    	public void seteDay(int eDay) {
    		this.eDay = eDay;
    	}
    	public List<String> getDevelopers() {
    		return developers;
    	}
    	public void setDevelopers(List<String> developers) {
    		this.developers = developers;
    	}
    	public Map<String, String> getAdministrators() {
    		return administrators;
    	}
    	public void setAdministrators(Map<String, String> administrators) {
    		this.administrators = administrators;
    	}
    	public Map<String, DataBaseConnectionInfo> getDbInfos() {
    		return dbInfos;
    	}
    	public void setDbInfos(Map<String, DataBaseConnectionInfo> dbInfos) {
    		this.dbInfos = dbInfos;
    	}
    }

    applicationContext.xml에 bean 추가

    <bean class="com.mav.member.dto.EMSInformationService" id="informationService">
    	<property name="info">
    		<value>Education Management System program was developed in 2015.</value>
    	</property>
    	<property name="copyRight">
    		<value>COPYRIGTH(C) 2015 EMS CO., LTD. ALL RIGHT RESERVED.
    		CONTACT MASTER FOR MORE INFORMATION</value>
    	</property>
    	<property name="ver"><value>The version is 1.0</value></property>
    	<property name="sYear"><value>2021</value></property>
    	<property name="sMonth"><value>10</value></property>
    	<property name="sDay"><value>19</value></property>
    	<property name="eYear"  value="2021"/> <!-- 단일태그 방식 -->
    	<property name="eMonth" value="11"/>
    	<property name="eDay" value="19"/>
    
    	<property name="developers">
    		<list>
    			<value>Cheney.</value><value>Eloy.</value>
    			<value>Jasper.</value><value>Dillon.</value>
    			<value>Klan.</value>
    		</list>
    	</property>
    	<property name="administrators">
    		<map>
    			<entry>
    				<key><value>Cheney</value></key>
    				<value>cheney@springPjt.org</value>
    			</entry>
    			<entry>
    				<key><value>Jasper</value></key>
    				<value>jasper@springPjt.org</value>
    			</entry>
    		</map>
    	</property>
    		<property name="dbInfos">
    		<map>
    			<entry>
    				<key><value>dev</value></key>
    				<ref bean="dbconinfo1"></ref>
    			</entry>
    			<entry>
    				<key><value>real</value></key>
    				<ref bean="dbconinfo2"></ref>
    			</entry>
    		</map>
    	</property>
    </bean

    MainClass에 코드 추가

    EMSInformationService eis=ctx.getBean("informationService",EMSInformationService.class);
    eis.outputEMSInformation();
    MainClass 실행 결과

    @Autowired: 의존객체 자동주입

     

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>spring</groupId>
      <artifactId>Sp05</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>SpringEx</name>
       
        <repositories>
      	<repository>
      		<id>oracle</id>
      		<name>ORACLE JDBC Repository</name>
      		<url>http://maven.jahia.org/maven2</url>
      	</repository>
      </repositories>
      
      <dependencies>
      	<dependency>
      		<groupId>org.springframework</groupId>
      		<artifactId>spring-context</artifactId>
      		<version>4.1.0.RELEASE</version>
      	</dependency>
      </dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<artifactId>maven-compiler-plugin</artifactId>
    				<version>3.1</version>
    				<configuration>
    					<source>1.8</source>
    					<target>1.8</target>
    					<encoding>utf-8</encoding>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    	
    </project>

    sql

    drop table wordset;
    create table wordset(
    	wordkey varchar2(20),
    	wordValue varchar2(500)
    )

    Dto

    package com.mav.word.dto;
    
    public class WordSet {
    	private String wordKey;
    	private String wordValue;
    
    // 마우스 우클릭 후 Source 누르고 
    // Generate Getters and Setters... 클릭
    // Generate Constructor using Fields... 클릭
    // 아래와 같이 생성됨
    
    	public WordSet(String wordKey, String wordValue) {
    		super();
    		this.wordKey = wordKey;
    		this.wordValue = wordValue;
    	}
    	public String getWordKey() {
    		return wordKey;
    	}
    	public void setWordKey(String wordKey) {
    		this.wordKey = wordKey;
    	}
    	public String getWordValue() {
    		return wordValue;
    	}
    	public void setWordValue(String wordValue) {
    		this.wordValue = wordValue;
    	}
    }

    Dao

    package com.mav.word.dao;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    import com.mav.word.dto.WordSet;
    import com.mav.word.util.DataBaseManager;
    
    public class WordSetDao {
    	Connection con=null;
    	PreparedStatement pstmt=null;
    	ResultSet rs=null;
    	
    	DataBaseManager dbm;
    	public WordSetDao(DataBaseManager dbm) {
    		this.dbm=dbm;
    	}
    	public void insert(WordSet wordSet) {
    		con=dbm.getConnection();
    	}
    }

     

    DataBase

    package com.mav.word.util;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class DataBaseManager {
    
    	private DataBaseUserInfo dbi;
    	public DataBaseManager(DataBaseUserInfo dbi) {
    		this.dbi=dbi;
    	}
    	
    	public Connection getConnection()	{
    		Connection con=null;
    		try {
    			Class.forName(dbi.getDriver());
    			con=DriverManager.getConnection(dbi.getUrl(),dbi.getId(),dbi.getPw());
    		} catch(ClassNotFoundException e) {e.printStackTrace();
    		} catch(SQLException e) {e.printStackTrace();}
    		return con;
    	}
    	public void close(Connection con, PreparedStatement pstmt, ResultSet rs)	{
    		try {
    			if(con!=null) con.close();
    			if(pstmt!=null) pstmt.close();
    			if(rs!=null) rs.close();
    		}catch(SQLException e) {e.printStackTrace();}
    	}
    }
    package com.mav.word.util;
    
    public class DataBaseUserInfo {
    	private String url;
    	private String id;
    	private String pw;
    	private String driver;
    	public String getUrl() {
    		return url;
    	}
    	public void setUrl(String url) {
    		this.url = url;
    	}
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getPw() {
    		return pw;
    	}
    	public void setPw(String pw) {
    		this.pw = pw;
    	}
    	public String getDriver() {
    		return driver;
    	}
    	public void setDriver(String driver) {
    		this.driver = driver;
    	}
    }

    appCtx.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	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.xsd">
    	<context:annotation-config />
    	<bean class="com.mav.word.util.DataBaseUserInfo" id="dbuserinfo">
    	 	<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    	 	<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
    	 	<property name="id" value="scott"/>
    	 	<property name="pw" value="tiger"/>
    	 </bean>
    이 안에 추가될 코드들 배경색은 검정
    </beans>

     

    	 <bean class="com.mav.word.util.DataBaseManager" id="dbmanager"></bean>
    	<!-- 
        원래 코드
    	<bean class="com.mav.word.util.DataBaseManager" id="dbmanager">
    	 <constructor-arg ref="dbuserinfo"></constructor-arg>
    	</bean> 
    	--> 

    bean에 constructor이 없으므로 DataBaseManager 클래스 수정

    import org.springframework.beans.factory.annotation.Autowired;
    	@Autowired
    	private DataBaseUserInfo dbi; // 의존객체 주입 -> 자동주입
    	
    //	public DataBaseManager(DataBaseUserInfo dbi) {
    //		this.dbi=dbi;
    //	}

     

    <bean class="com.mav.word.dap.WordSetDao" id="worddao"></bean>

    WordSetDao 클래스 수정

    	@Autowired
    	DataBaseManager dbm;
    
    //	public WordSetDao(DataBaseManager dbm) {
    //		this.dbm=dbm;
    //	}
     
     

    Insert 하기

    package com.mav.word.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.mav.word.dao.WordSetDao;
    import com.mav.word.dto.WordSet;
    
    public class WordInsertService {
    	@Autowired
    	private WordSetDao worddao;
    	public void insert(WordSet wordSet) {
    		worddao.insert(wordSet);
    	}
    }
    <bean class="com.mav.word.service.WordInsertService" id="insertService"></bean>
     

    WordSetDao에 insert 메서드 추가

    public void insert(WordSet wordSet) {
    	String sql="insert into wordset values(?,?)";
    	con=dbm.getConnection();
    	try {
    		pstmt=con.prepareStatement(sql);
    		pstmt.setString(1, wordSet.getWordKey());
    		pstmt.setString(2, wordSet.getWordValue());
    		pstmt.executeUpdate();
    	}catch(SQLException e) {e.printStackTrace();
    	} finally {dbm.close(con, pstmt, rs);}
    }

     

    package com.mav.word.main;
    
    import org.springframework.context.support.GenericXmlApplicationContext;
    
    import com.mav.word.dto.WordSet;
    import com.mav.word.service.WordInsertService;
    
    public class MainClass {
    	
    	public static void main(String[] args) {
    		String[] keyWords= {"c","c++","java","jsp","spring"};
    		String[] values= {
    				"C는 1972년 켄 톰슨과 데니스 리치가 유닉스 운영 체제에서 사용하기 위해 개발한 프로그래밍 언어이다",
    				"C++는 AT&T 별 연구소의 비야네 스트롭스트룹이 1983년 발표하여 발전한 프로그래밍 언어이다",
    				"자바는 씬 마이크로시스템즈의 제임스 James Gosling과 다른 연구원들이 개발한 객제 치향적 프로그래밍 언어이다",
    				"JSP는 HTML내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹페이지를 생성하여 웹 브라우저에 둘러주는 언어이다",
    				"스프링 프레임어크는 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임 워크로서 간단히 스프링이라고 불린다"
    		};
    		GenericXmlApplicationContext ctx=new GenericXmlApplicationContext("classpath:appCtx.xml");
    		WordInsertService wis=ctx.getBean("insertService",WordInsertService.class);
    		
    		for(int i=0; i<keyWords.length; i++) {
    			WordSet wordSet=new WordSet(keyWords[i],values[i]);
    			wis.insert(wordSet);
    		}
    	}
    }
     
     

    Select 하기

    package com.mav.word.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.mav.word.dao.WordSetDao;
    import com.mav.word.dto.WordSet;
    
    public class WordSearchService {
    
    	@Autowired
    	private WordSetDao worddao;
    	
    	public WordSet searchWord(String kw) {
    		WordSet ws=worddao.search(kw);
    		return ws;
    	}
    }
    <bean class="com.mav.word.service.WordSearchService" id="searchService"></bean>

    WordSetDao에 search 메서드 추가

    public WordSet search(String kw) {
    	WordSet ws=null;
    	String sql="select *from wordset where wordkey=?";
    	con=dbm.getConnection();
    	try {
    		pstmt=con.prepareStatement(sql);
    		pstmt.setString(1, kw);
    		rs=pstmt.executeQuery();
    		if(rs.next()) {
    			ws=new WordSet(
    					rs.getString("wordkey"),
    					rs.getString("wordvalues")
    					);
    		}
    	}catch(SQLException e) {e.printStackTrace();
    	} finally {dbm.close(con, pstmt, rs);}
    	return ws;
    }

    MainClass에 추가

    WordSearchService ss=ctx.getBean("searchService",WordSearchService.class);
    Scanner sc=new Scanner(System.in);
    System.out.printf("검색할 단어를 입력하세요: ");
    String input=sc.nextLine();
    WordSet ws=ss.searchWord(input);
    if(ws==null) {
    	System.out.println("검색한 단어는 존재하지 않습니다");
    } else {
    	System.out.println("\n\n");
    	System.out.print(ws.getWordKey()+"\t ");
    	System.out.print(ws.getWordValue());
    }
    ctx.close();

     

     

    댓글

Designed by Tistory.