스프링부트와 JDBC

박경현·2023년 3월 29일
0

스프링 부트에서 제공하는 기능들을 같이 사용해서 DB를 조회하고 데이터를 넣어보려고 한다!!

그러기 위해서 필요한 내용들을 하나씩 정리해보려고 한다!

application.yml 먼저 설정하기!

원래는 application.properties로 되어있던걸 yml 파일로 바꿔줬다

편의성을 위해 바꿔준것이기 때문에 application.properties로 설정하는걸 찾아서 해도 문제 없을거 같다

spring:
	datasource:
    	url:jdbc:mysql://127.0.0.1:3306/examplesdb?useUnicode=true
        username:urstory
        password:u1234

spring안쓰고 자바로만 jdbc 사용해보기

spring 부트에서 서버 구동시점에 초기화작업으로 무언가를 넣고 싶다면 사용할 수 있는 방법 중 하나가
CommandLineRunnder인터페이스를 상속 받는 것이다!
그러면 내부 메소드인 run()에 어플리케이션의 초기작업(Bean 등록 등)이후 실행 로직 적어주면 된다
!

그래서 우리도 이걸 사용하기 위해 인터페이스를 넣어줬다!

@SpringBootApplication
public class JdbcPracticeApplication implements CommandLineRunner {
	public static void main(String[] args) {
    
    	SpringApplication.run(JdbcPracticeApplication.class, args);
    }
    @Autowired
    DataSource dataSource;
	public void run(String ...args) throws Exception {
    	System.out.println(“스프링 부트가 관리하는 빈을 사용가능!”);
        Connection conn = dataSource.getConnection();
        PreparedStatement ps = conn.prepareSta![](https://velog.velcdn.com/images/rudgus/post/54054c82-c90b-4fb6-b84c-ef059f7f126a/image.png)
tement("select role_id, name from role");
        Result rs = ps.executeQuery();
        while(rs.next()) {
        	int roleId = rs.getInt("role_id");
            String name = rs.getString("name");
            System.out.println(roleId + ": " + name);
        }
        rs.close();
        ps.close();
        conn.close();
    }
}

DataSource 자체는 인터페이스! -> 스프링이 자동으로 HikariDataSource를 등록해준다!

커넥션 풀이란?

미리 데이터베이스랑 연결을 해놓음!
사용자가 데이터 베이스 사용을 원하면 connection을 빌려줌!

close하게 되면 connection Pool에 되돌려줌!, 끊어지는게 아니다!
빨리 되돌려줘야함! HTTP요청은 동시에여러개 올수있어서 너무 많이 동시에 빌려가면 멈추게 됨!

이제 spring을 이용한 jdbc를 조작해보자!

여기서 DTO는 (Data Transfer Object)이며 계층간 데이터 교환을 위해 사용하는 Java Bean이다!

Database에서 데이터를 얻어 Service나 Controller등으로 보낼때 사용하는 객체!
객체의 속성과 getter,setter만 가지고 있음!

DAO(Data Access Object)는 데이터베이스에 접근하는 객체이다!

Entity는 실제 DB테이블과 매칭될 클래스, 가장 Core한 클래스이기도 함

DTO와 Entity를 분리하는 이유

View Layer와 DB Layer의 역할을 철저하게 분리하기 위해서다!

테이블과 매핑되는 Entity클래스가 변경되면 여러 클래스에 영향을 끼치지만
view와 통신하는 DTO클래스는 자주 변경되므로 분리해야한다!!

spring을 이용한 jdbc 코드

domain/Role.java
여기가 Entity역할을 할 예정이다!

public class Role {
    private int roleId; // role_id
    private String name; //name

    public int getRoleId() {
        return roleId;
    }

    public void setRoleId(int roleId) {
        this.roleId = roleId;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

repository/RoleDAo
이 부분이 위에 Role을 조작해서 삭제 추가 및 조회를 하는 함수들이 있는 곳이다!

@Repository
public class RoleDao {
	private final JdbcTemplate jdbcTemplate;
    
    public RoleDao(DataSource dataSource) {
    	System.out.println("RoleDAO"+dataSource.getClass().getName());
        // 데이터소스 집어넣기
        jdbcTemplate = new JdbcTemplate(dataSource);
    }
    
    public boolean addRole(Role role) {
    	String sql="insert into role(role_id,name) values(?,?)";
        int result = jdbcTemplate.update(sql,role.getId(), role.getName());
        return result;
    }
    
    public boolean deleteRole(int roleId) {
    	String sql = "DELETE FROM role WHERE role_id=?";
        int result = jdbcTemplate.update(sql,roleId);
        return result;
    }
    public Role getRole(int roleId) {
    	String sql = "SELECT role_id,name FROM role WHERE role_id=?";
        return jdbcTemplate.queryForObject(sql,(rs,rowNum)-> {
        	Role role = new Role();
            role.setRoleId(rs.getInt("role_id"));
            role.setName(rs.getString("name"));
            return role;
        }roleId);
    }
}
profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글