[spring Boot]_9일차_DB연결2

youuu·2022년 10월 27일
0

SPRING

목록 보기
14/33

어제에 이어서 진행.
어제 예제


MVC


  1. 핸들러 조회 : 핸들러 매핑을 통해 URL에 매핑된 핸들러(컨트롤러) 조회
  2. 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터 조회
  3. 핸들러 어댑터 실행: 핸들러 어댑터 실행
  4. 핸들러 실행: 핸들러 어댑터가 실제 핸들러를 실행
  5. ModelAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해 반환.
  6. viewResolver 호출: 뷰 리졸버를 찾아 실행한다.
    ⇒ JSP: InternalResourceViewResolver가 자등 등록되어 사용된다.
  7. View 반환: 뷰 리졸버는 뷰의 논리 이름을 물이 이름으로 바꾸고 렌더링 역할을 담당하는 뷰 객체 반환.
    ⇒ JSP: InternalResourceView(JstlView)를 반환하는데, 내부에는 forward() 가 있다.
  8. 뷰 렌더링: 뷰를 통해서 뷰를 렌더링한다.

📂 com.oracle.oBootDBConnect.repository

📋 JdbcMemberRepository.java


service 에서 @Repository를 두개 썼을경우

🧪 해결 : MemoryMemberRepository.java에서 @Repository를 지우면 된다



🌱 환경설정 DI를 사용하는 이유


  • 부품처럼 넣고 빼고가 편하다.

📋 SpringConfig.java

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 작성 _ save, findAll


📋 JdbcMemberRepository.java

@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();
		}
	}
}

### 📋 MemoryMemberRepository.java * 메모리에 올리는 Repository
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());
	}
		
}

💻 결과화면 :

profile
공부중인 주니어 개발자

0개의 댓글