일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- react
- EER
- 행정지역 DB
- 메모리 포랜식
- webhacking 처음
- DBMS
- ㅁㅇㅂ??ㅇㅈㄷ ㅎㅇㅌ...
- Layered Architecture
- restapi
- mysql
- 네이버 인턴
- 정보보호병 후기
- jsp
- PyAmdecoder
- 방명록 만들기
- riceteacatpanda
- 동읍면 DB
- 인턴 후기
- Forensic 절차
- JSTL
- 3단계 지역 DB
- frontend
- SessionAttribute
- 인턴 지원
- Django
- 소프트웨어 개발보안 경진대회
- reversing.kr
- spring
- Database
- 소개딩
- Today
- Total
웹찢남
Spring - JDBC(DTO,DAO) 본문
방학하고 게으르게 살다가 다시 공부 시작합니다..
지금까지 Python 기반의 Django나 Flask 프로젝트들을 2개씩 진행했는데
취직을 위해서는 Spring를 공부해야겠다는 생각이 들었어요!
남은 1년동안 Spring, 코테, CS 공부를 진행 할 예정이에요!
취 뽀 가 자!!!
Spring은 네이버의 부스트 코스의 강의를 들으며 공부를 시작합니다!
DAO(Data Access Object) : 데이터 베이스에 접속, 명령전송을 전담하는 클래스
DTO(Data Transfer Object) : 특정 테이블의 정보를 레코드 단위로 정의해놓은 클래스
Role.Java (DTO)
package kr.or.connect.jdbcexam.dto;
public class Role {
private Integer roleId;
private String description;
public Role() {
}
public Role(Integer roleId, String description) {
super();
this.roleId = roleId;
this.description = description;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Role [roleId=" + roleId + ", description=" + description + "]";
}
}
위 코드를 보면 우선 Role이라는 클래스를 만들죠
이 Role은 DB에 있는 table 명이고 role_id,description column을 가지고 있어요
각각의 column은 get, set을 사용해 this.roleid=roleid 이런 식으로 값도 바꾸고 return도 하네요
toString을 오버라이드해서 나중에 role 객체를 선언한 후 println하면 저런 양식으로 출력을 하내요
간단히 생각해보면 DTO는 MYsql table의 정보를 정의,구체화 해서 갖다 쓰기 좋게하는 것 같네용
RoleDao.java (DAO)
public Role getRole(Integer roleId) {
Role role = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
String sql = "SELECT description,role_id FROM role WHERE role_id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, roleId);
rs = ps.executeQuery();
if (rs.next()) {
String description = rs.getString(1);
int id = rs.getInt("role_id");
role = new Role(id, description);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return role;
}
RoleDao 클래스 내부의 getRole 메서드 입니다.
JDBC 프로그래밍의 경우 몇단계에 걸쳐 진행되죠.
위에서 차례대로 보면 처음에 Class.forName으로 jdbc Driver를 로드하네요
다음엔 DriverManger을 통해 DB와 connection을 맺고 prepareStatement를 통해 statement 객체를 선언해요.
Statement 객체는 Connection 객체를 통해 SQL을 실행하고 그 결과 값을 반환하는 친구에요
Statement도 종류가 여러개 있는데 네이버는 prepareStatment를 썼는데 효율적이고 보안적으로 좋기 때문인것 같네요.
그 후 executeQuery를 통해 statement 객체를 실행 시키고 rs로 값을 반환받아요.
rs.next를 통해 값을 받아 사용하고 마지막엔 finally 구문으로 꼭 * rs,ps,conn을 close 해야해요. *
근데 요즘은 저런 식으로 conn,rs,ps를 사용하지 않고 try with resource 방식이 새로 생겨 사용한데요
RoleDao.java (DAO)
public List<Role> getRoles() {
List<Role> list = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String sql="SELECT description, role_id FROM role order by role_id desc";
try (Connection conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql)) {
try(ResultSet rs = ps.executeQuery()){
while(rs.next()) {
String description = rs.getString(1);
int id = rs.getInt("role_id");
Role role = new Role(id,description);
list.add(role);
}
} catch (Exception ex) {
ex.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return list;
}
RoleDao 클래스 내부의 getRoles 메서드 입니다.
전의 getRole은 WHERE role_id=?가 붙어 있어 하나의 row만 반환하지만
이번에는 list 형태로 Role 객체들을 반환하네요.
여기서 주의 깊게 볼 부분은 두번째 try 구문이에요
try(Connetry (Connection conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql))
이 부분을 통해 try-finally로 열고 닫던걸 한 번에 처리하네요!
'BACK_END > Spring 공부' 카테고리의 다른 글
Spring - Scope (0) | 2021.02.02 |
---|---|
Spring - JSP (0) | 2021.02.01 |
Spring - Servlet 생명 주기 (0) | 2021.02.01 |
Spring - DBMS,MiddleWare,WAS (0) | 2021.01.26 |
Spring 1일차 (게시판 만들기) (0) | 2020.08.10 |