JdbcMemberRepository.class ==> @Repository 주석처리후 아래 SpringConfig.class 작성
package com.oracle.oBootDbConnect.repository;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.stereotype.Repository;
import com.oracle.oBootDbConnect.domain.Member7;
//@Repository
public class JdbcMemberRepository implements MemberRepository {
// JDBC 사용
private final DataSource dataSource;
@Autowired
public JdbcMemberRepository(DataSource dataSource) {
this.dataSource = dataSource;
}
private Connection getConnection() {
return DataSourceUtils.getConnection(dataSource);
}
// 현장 HW 2-1
// DB에 insert 되는 로직 만들기
@Override
public Member7 save(Member7 member7) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "insert into member7(id,name) values(member_seq.nextval,?)";
//id는 request 데이터라 들어오지 않았기 때문에, sequence 값으로 넘겨주기
System.out.println("JdbcMemberRepository save sql->"+sql);
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, member7.getName());
pstmt.executeUpdate();
return member7;
} catch (Exception e) {
throw new IllegalStateException();
} finally {
close(conn, pstmt, rs);
}
}
// DB에 있는 내용을 가져와서 ArrayList에 넣기
@Override
public List<Member7> findAll() {
Connection conn = null;
PreparedStatement pstmt =null;
ResultSet rs = null;
String sql = "select * from member7";
System.out.println("JdbcMemberRepository findAll() sql->"+sql);
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
List<Member7> members = new ArrayList<>();
while(rs.next()) {
Member7 member = new Member7();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
members.add(member);
}
return members;
} catch (Exception e) {
throw new IllegalStateException();
} finally {
close(conn, pstmt, rs);
}
}
// 메모리 해제
private void close(Connection conn , PreparedStatement pstmt , ResultSet rs)
{
//JSP에서 한 방식으로 close를 해도 되고, 아래의 방식으로 해도 됨
try {
if (rs != null) rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (pstmt != null) pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) close(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
private void close(Connection conn) throws SQLException {
DataSourceUtils.releaseConnection(conn, dataSource);
}
}
SpringConfig.class Tip)
@Bean
@Component 를 포함하는 @Controller, @Service, @Repository 애노테이션이 아니면 Springbean 으로 자동 등록되지 않기 때문에, 따로 @Bean설정을 하고 SpringConfig를 넣어줘야 함
이 부분의 설정을 잘 운영하면 다른 소프트웨어를 사용하려 할때도 유지보수가 용이해짐
생성자부분 설명 10:33분 부터 다시 보고 작성하기
return new MemoryMemberRepository(); => 입력한 값을 Memory에만 업로드하며, DB에는 저장되지 않음
return new JdbcMemberRepository(dataSource); => 입력한 값이 DB에도 업로드됨
package com.oracle.oBootDbConnect;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.oracle.oBootDbConnect.repository.JdbcMemberRepository;
import com.oracle.oBootDbConnect.repository.MemberRepository;
import com.oracle.oBootDbConnect.repository.MemoryMemberRepository;
@Configuration
public class SpringConfig {
private DataSource dataSource;
public SpringConfig() {
this.dataSource = dataSource;
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository(); // ==> Memory로 부품 교체할때 사용
// ()안에 아무것도 없다는 것은 따로 설정한 생성자가 없기 때문에, 기본 생성자를 쓰겠다는 것
//return new JdbcMemberRepository(dataSource); ==> Oracle로 부품 교체할때 사용
}
}
(폴더:oBootBoard)
새 Spring Starter 폴더 생성
build.gradle 로직에 아래 세 줄 추가하여 수동으로 프로그램 삽입하기 => build.gradle에 우클릭해서 Refresh 꼭 하기 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation group: 'org.glassfish.web', name: 'jakarta.servlet.jsp.jstl', version: '2.0.0' implementation 'com.googlecode.json-simple:json-simple:1.1.1'
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.2'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.oracle'
version = 'version.1.0'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation group: 'org.glassfish.web', name: 'jakarta.servlet.jsp.jstl', version: '2.0.0'
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
application.yml(class 아니고 New File임!) => 줄 잘 안맞춰주면 인식못함 아래 로직 저장후, main폴더에 WEB-INF폴더 만들고, 그 안에 views 폴더 만들기