민스씨의 일취일장

LogT | Java Spring로 DB 다루기에 대해 알게된 모든 내용과 고민들 본문

Programming Language & Framework/JAVA & Spring

LogT | Java Spring로 DB 다루기에 대해 알게된 모든 내용과 고민들

읻민스 2023. 1. 13. 22:46
반응형

Java Spring으로 DB를 다루는 방법에 대해서 알게된 모든 내용과 고민들을 시간순으로 기록하는 페이지이다.


Java를 이용해서 DB 연결하기

사용한 DB : MySQL

  • JDBC API를 사용한다.
  • DriverManager 객체를 사용한다.
  • 데이터를 테이블로 읽어와서 한줄 (row) 단위로 읽으면서 사용한다.

Spring을 이용해서 DB 연결하기

사용한 DB : MySQL

  • Spring JDBC API를 사용한다.
  • DriverManagerDataSource 객체를 사용한다.
  • root-context.xml에 Bean으로 연결 정보를 저장해서 연결을 단순화 하고 향후 수정해야 할 곳을 한곳으로 모을 수 있다.

Bean

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://[host]/[DB-NAME]?useUnicode=true&amp;characterEncoding=utf8"></property>
		<property name="username" value="[Registered-DB-ID]"></property>
		<property name="password" value="[Registered-DB-Password]"></property>
</bean>

위에서 [host], [DB-NAME], [Registered-DB-ID], [Registered-DB-Password]에는 각자 상황에 맞는 값을 넣어주어야 한다.

대입해야 할 곳 예시
host localhost:3306
DB-NAME ydminsdb
Registered-DB-ID root
Registered-DB-Password 실제 등록한 비밀번호

직접 연결

ApplicationContext ac = new GenericXmlApplicationContext("file:src/main/webapp/WEB-INF/spring/**/root-context.xml");
DataSource ds = ac.getBean(DataSource.class);
Connection conn = ds.getConnection();

Annotation을 이용한 자동 연결

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
public class DBConnectionTest2Test {
    @Autowired
    DataSource ds;
    
. . .}

Spring을 이용해서 DB에서 사용할 Query 사용하는 방법

PreparedStatement 객체를 사용한다.

직접 작성

Connection conn = ds.getConnection();

String sql = "insert int board values ('id', 'ydmins', '2023-01-13", "DB 학습");"
PreparedStatement pstmt = conn.prepareStatement(sql);

int rowCnt = pstmt.executeUpdate();
  • excueteUpdate()

SQL Query의 insert, delete, update에 사용하는 함수이다. return 값은 작업한 행의 수, 즉 int값을 반환한다. return 값이 0일 경우 실패한 것이다.

PrearedStatement의 메서드를 사용

Connection conn = ds.getConnection();
   
String sql = "insert into board values (?,?,?,?);";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "[id]");
pstmt.setString(2, "[name]");
pstmt.setDate(3, "[contents]");
pstmt.setDate(4,"[date]");

int rowCnt = pstmt.executeUpdate();

 SQL Query문에서 DB에 저장할 값들의 자리에 ?를 넣는다. 그다음 settter를 활용해 하나하나 값을 넣어준다. 이렇게 했을 때의 두가지 장점이 있다. 

  • SQL Injection 공격 방지

SQL Query 영역에 의도치 않은 Query를 주입하는 공격에 대비할 수 있다.

  • 성능 향상

sql에 저장된 쿼리문을 인스턴스 변수처럼 사용하기 때문에 하나의 쿼리문으로 인식해 성능 향상을 기대할 수 있다. 직접작성할 경우 각각의 Query Execute에 사용된 쿼리문을 각각 인식하기 때문이다. [* 설명히 개념들의 오인으로 틀릴 수 있음을 미리 알린다.]

 

 

728x90
반응형