어제에 이어서 진행.
어제 예제
MVC
🧪 해결 : MemoryMemberRepository.java에서 @Repository
를 지우면 된다
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 final DataSource dataSource;
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean
public MemberRepository memberRepository() {
// return new JdbcMemberRepository(dataSource);
return new MemoryMemberRepository();
}
}
@Repository
를 부품처럼 갈아 낄 수 있다.
JdbcMemberRepository --> DB
MemoryMemberRepository --> 메모리
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.jdbc.datasource.DataSourceUtils;
import org.springframework.stereotype.Repository;
import com.oracle.oBootDBConnect.domain.Member1;
@Repository
public class JdbcMemberRepository implements MemberRepository {
// JDBC 사용
private final DataSource dataSource;
// final -> 변경하지 않겠다 (setter를 통해 변경하지 않겠다.)
public JdbcMemberRepository(DataSource dataSource) {
this.dataSource = dataSource;
}
// JdbcMemberRepository 안에서만 열결할 수 있게.
private Connection getConnection() {
return DataSourceUtils.getConnection(dataSource);
}
@Override
public Member1 save(Member1 member1) {
String sql = "insert into member1(id, name) values(member_seq.nextval,?)";
System.out.println("JdbcMemberRepository sql --->" + sql);
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, member1.getName());
pstmt.executeUpdate();
System.out.println("JdbcMemberRepository pstmt.executeUpdate After ===========");
return member1;
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt, rs);
}
}
@Override
public List<Member1> findAll() {
String sql = "select * from member1";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
List<Member1> members = new ArrayList<>();
while (rs.next()) {
Member1 member = new Member1();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
members.add(member);
}
return members;
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt, rs);
}
}
//release -> 메모리해제
private void close(Connection conn) throws SQLException {
DataSourceUtils.releaseConnection(conn, dataSource);
}
private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) {
try {
if(rs != null) rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null) close(conn);
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(pstmt != null) pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package com.oracle.oBootDBConnect.repository;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.oracle.oBootDBConnect.domain.Member1;
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member1> store = new HashMap<Long, Member1>();
private static long sequence = 0L;
@Override
public Member1 save(Member1 member1) {
System.out.println("MemoryMemberRepository save Start ======");
member1.setId(++sequence);
store.put(member1.getId(), member1);
return member1;
}
@Override
public List<Member1> findAll() {
System.out.println("MemoryMemberRepository findAll Start ======");
return new ArrayList<>(store.values());
}
}