이번실습은 저번실습에 이어서 응용버젼을 공부해보려고 합니다!
06. Spring - ★JDBCTemplate 연동★
+ 실습에 들어가기전에 ( ※ 이번실습은 매우매우 중요해서 정말 열심히 공부해보겠습니다. ※) (★★★★★★★★★★★ 중요 ★★★★★★★★★★★) 들어가기에 앞서, 이번 실습은 준비물
mom11230.tistory.com
준비물이 필요한 실습인 만큼 저번 실습이 기억안나시는 분들은 공부하고 와주세요!

이번 실습의 목표는 다음과 같습니다.
1. Test 클래스를 실행하면 Enter Employee ID: 에 번호를 입력할 수 있는 값이 나온다
2. SQL Developer에 저장해놓은 Employee TABLE의 id 번호를 입력했을 때 일치하면 Passenger TABLE 을 호출한다.
3. Passenger TABLE에 저장해놓은 address, start_point, end_point, fare(요금) 데이터가 출력되게 한다.

(저번에는 TABLE 한개 연결하기도 어려웠는데....구....ㅅ...😎😎)
이번실습에서 필요한 코드입니다. 참조하세요!
가. 구현 방법 (전체구성)
사용
pakages : org.kitri.jdbctemplate.dao
org.kitri.jdbctemplate.dao.impl
org.kitri.jdbctemplate.dto
org.kitri.jdbctemplate.main
class : EmployeeDao.java
EmployeeDaoImpl.java
Employee.java
Passenger.java
Test.java
xml : config.xml
pom.xml

원래 실습은 PassengerDao, PassengerDaoimpl 도 클래스로 만들어서 호출 하는거였지만 저는 한번 다르게 실습해보았습니다.
pakages : org.kitri.jdbctemplate.dao
Class : EmployeeDao.java

package org.kitri.jdbctemplate.dao;
import org.kitri.jdbctemplate.dto.Employee;
import org.kitri.jdbctemplate.dto.Passenger;
import java.util.List;
public interface EmployeeDao {
List<Employee> getAllEmployees();
List<Passenger> getPassengersByEmployeeId(int employeeId);
}
이 코드에서는 List 목록인 Employee, Passnger 의 interface 역할을 하는 코드를 구현했습니다.
pakages : org.kitri.jdbctemplate.dao.impl
Class : EmployeeDaoImpl.java

package org.kitri.jdbctemplate.dao.impl;
import org.kitri.jdbctemplate.dao.EmployeeDao;
import org.kitri.jdbctemplate.dto.Employee;
import org.kitri.jdbctemplate.dto.Passenger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.util.List;
@Component("emp")
public class EmployeeDaoImpl implements EmployeeDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public List<Employee> getAllEmployees() {
String sql = "SELECT * FROM Employee";
List<Employee> employees = jdbcTemplate.query(sql, (resultSet, i) -> {
Employee employee = new Employee();
employee.setId(resultSet.getInt("id"));
employee.setFirstName(resultSet.getString("first_name"));
employee.setLastName(resultSet.getString("last_name"));
return employee;
});
return employees;
}
@Override
public List<Passenger> getPassengersByEmployeeId(int employeeId) {
String sql = "SELECT * FROM Passenger WHERE employee_id = ?";
List<Passenger> passengers = jdbcTemplate.query(sql, new Object[]{employeeId}, (resultSet, i) -> {
Passenger passenger = new Passenger();
passenger.setId(resultSet.getInt("id"));
passenger.setEmployeeId(resultSet.getInt("employee_id"));
passenger.setAddress(resultSet.getString("address"));
passenger.setStartPoint(resultSet.getString("start_point"));
passenger.setEndPoint(resultSet.getString("end_point"));
passenger.setFare(resultSet.getDouble("fare"));
return passenger;
});
return passengers;
}
}
이 클래스는 Spring 프레임워크에서 관리되는 빈으로서, 데이터베이스와의 상호 작용을 담당합니다. 필요에 따라 메서드를 추가하거나 수정하여 데이터베이스와의 상호 작용을 확장할 수 있습니다.
pakages : org.kitri.jdbctemplate.dto
Class : Employee.java

package org.kitri.jdbctemplate.dto;
public class Employee {
private int id;
private String firstName;
private String lastName;
public Employee() {
}
public Employee(int id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
이 클래스는 데이터베이스나 다른 계층 간에 직원 정보를 전달하는 데 사용됩니다. 주로 DAO(Data Access Object)나 서비스 계층에서 데이터베이스에서 읽어온 직원 정보를 객체로 변환하거나, 사용자가 입력한 직원 정보를 데이터베이스에 전달할 때 사용됩니다.
pakages : org.kitri.jdbctemplate.dto
Class : Passenger.java
(코드가 길어서 일부만 캡쳐했습니다.)

package org.kitri.jdbctemplate.dto;
public class Passenger {
private int id;
private int employeeId;
private String address;
private String startPoint;
private String endPoint;
private double fare;
public Passenger() {
}
public Passenger(int id, int employeeId, String address, String startPoint, String endPoint, double fare) {
this.id = id;
this.employeeId = employeeId;
this.address = address;
this.startPoint = startPoint;
this.endPoint = endPoint;
this.fare = fare;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getStartPoint() {
return startPoint;
}
public void setStartPoint(String startPoint) {
this.startPoint = startPoint;
}
public String getEndPoint() {
return endPoint;
}
public void setEndPoint(String endPoint) {
this.endPoint = endPoint;
}
public double getFare() {
return fare;
}
public void setFare(double fare) {
this.fare = fare;
}
}
이 클래스도 Employee.java 클래스와 동일합니다.
pakages : org.kitri.jdbctemplate.main
Class : Test.java

package org.kitri.jdbctemplate.main;
import org.kitri.jdbctemplate.dao.EmployeeDao;
import org.kitri.jdbctemplate.dto.Employee;
import org.kitri.jdbctemplate.dto.Passenger;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 스프링 컨테이너 생성
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:config.xml");
// EmployeeDao 빈 가져오기
EmployeeDao employeeDao = ctx.getBean("emp", EmployeeDao.class);
System.out.print("\n"+"Enter Employee ID: ");
int employeeId = scanner.nextInt();
List<Passenger> passengers = employeeDao.getPassengersByEmployeeId(employeeId);
if (!passengers.isEmpty()) {
System.out.println("Passenger 정보:"+"\n");
for (Passenger passenger : passengers) {
System.out.println("ID: " + passenger.getId());
System.out.println("Address: " + passenger.getAddress());
System.out.println("Start Point: " + passenger.getStartPoint());
System.out.println("End Point: " + passenger.getEndPoint());
System.out.println("Fare: " + passenger.getFare());
}
} else {
System.out.println("해당하는 Passenger 정보가 없습니다.\n");
}
ctx.close();
}
}
이코드를 실행하면 Enter Employee ID 를 입력하는 창이 Console에 나오게 되며, TABLE에 저장한 값과 일치할시 Passenger TABLE을 호출합니다.
xml : config.xml
여기서 주의해야할 점은 경로인데 저같은 경우에는
호스트주소 : 192.168.10.11
이름 : oracle
아이디/비번 : dst04/dst04
SID : DB19
를 사용하였습니다.
각자 만든 계정으로 주소를 바꾸지 않으면 정상적으로 실행되지않는다.


<?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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:util="http://www.springframework.org/schema/util"
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
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
<context:component-scan
base-package="org.kitri.jdbctemplate" />
<bean name="datasource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="oracle.jdbc.OracleDriver"
p:url="jdbc:oracle:thin:@192.168.10.11:1521:DB19"
p:username="dst04" p:password="dst04" />
<bean name="jdbctemplate"
class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="datasource" />
</beans>
나. SQL Developer TABLE 생성
모든 코드구성은 끝이 났다. 이제 SQL Developer 에서 TABLE 을 생성해보자 이번 실습에는 2개의 TABLE이 필요하다!

우선 기존에 생성한 TABLE이 있을 수 있으므로 Drop 을 이용해서 TABLE을 삭제한다.

그 후에 Employee, Passenger TABLE을 생성하는 코드를 만들었다. 이때 Employee의 id 가 Passenger id와 일치해야하므로 FOREIGN KEY(외래키) = employee_id 를 설정했고 ,기본키는 REFERENCES = Emplotee(id)를 사용했다.

그 다음에 TABLE 의 값을 집어 넣기 위한 VALUES 값을 만들었다 (예시이니까 마음대로 바꿔도 된다!)

마지막으로 SELECT 를 검색해서 TABLE 을 확인 할 수있게 만들었으며, 자동으로 commit 할 수 있게 만들었다.


그러면 이렇게 2개의 TABLE의 값이 들어간것을 볼 수 있다.

전체코드

Drop TABLE Employee;
Drop TABLE Passenger;
CREATE TABLE Employee (
id VARCHAR2(10) PRIMARY KEY,
first_name VARCHAR2(10),
last_name VARCHAR2(10)
);
CREATE TABLE Passenger (
id NUMBER PRIMARY KEY,
employee_id VARCHAR2(10),
address VARCHAR2(100),
start_point VARCHAR2(20),
end_point VARCHAR2(20),
fare NUMBER(20, 2),
FOREIGN KEY (employee_id) REFERENCES Employee(id)
);
INSERT INTO Employee (id, first_name, last_name) VALUES ('2', '홍', '길동');
INSERT INTO Employee (id, first_name, last_name) VALUES ('3', '키', '트리');
INSERT INTO Passenger (id, employee_id, address, start_point, end_point, fare)
VALUES (2, '2', '서울시 강남구', '강남구', '북가좌동', 50000.00);
INSERT INTO Passenger (id, employee_id, address, start_point, end_point, fare)
VALUES (3, '3', '서울시 북가좌동', '북가좌동', '구로구', 2500.00);
SELECT * FROM Employee;
SELECT * FROM Passenger;
commit;
다. 실행방법
이제 Test 클래스를 실행하게 되면

정상적으로 코드구현시 Enter Emplotee ID: 라는 문구가 나오게 되었다. 이제 여기에 저장 해놓은 ID 인 값을 집어넣어본다.

그러면 ID : 2 에 저장되어있던 정보가 이렇게 뙀!!!! 하고 나오게 된다. (야호야호~)
+ 새롭게 알아낸 사실~~~
이제 이번실습을 통해서 2개의 TABLE의 정보를 받을 수 있게 되었다. (이러다가 취업 빨리 할수도?????????키키)

'Spring' 카테고리의 다른 글
08. Spring - Mybatis (5) | 2024.05.02 |
---|---|
06. Spring - ★JDBCTemplate 연동★ (2) | 2024.04.23 |
05. Spring - Interface 주입 (2) | 2024.04.22 |
04. Spring- Auto Wiring(@Autowiring, @Qualifier) (3) | 2024.04.19 |
03. Spring- Properties (3) | 2024.04.18 |