하면 할수록 어렵다. 그래서 이번엔 강의따라 만든 JDBC프로그램을 아는 한도 내에서 해체해보는 시간을 가져야겠다.
이 사진을 보고 어떻게 만들지 머리속으로 구상해야 한다는데 전혀 되지 않는다. 그래서 생각의 과정을 무작정 따라해보기로 했다. 저 사진중에 몇몇은 스프링이 알아서 만드니 따로 클래스를 만들 필요는 없다.
사진해석
ApplicationContext는 따로 안만들어도 된다.
그림1을 보면 config가 두개 dao가 2개 dto가 한개다. 그래서 각각 패키지를 만들어준다.
config 패키지 dao패키지 dto 패키지 그리고 저 클래스들을 가져와 실행해줄 실행파일이 들어있는 main패키지
첫 번째 생각 순서
먼저 db연결이 잘 되는지 확인하기 위해 DBConfig클래스와 ApplicationConfig 클래스를 만든다.
각 클래스를 만들고 먼저해야할 일은 @Configuration을 만드는 일이다. 이것을 왜 만드냐고 하면
이 전 게시글처럼 Bean을 만드려면 id 와 클래스값을 지정하는등 매우 귀찮은 일을 해야하는데 그것을 간편하게 하기위해 어노테이션이라는 것을 사용한다. 저 문장은 그것을 사용하기 위한 준비단계라고 보면된다.
그리고 영어가 기니까 앞으로는 뒷단어는 ~로 생략해서 사용하겠다 ㅎㅎ...
applicationconfig 파일에 @confi~ 를 작성한다. 그 후 DBConfig를 import하기위해
@Import({DBConfig.class}) 를 사용하면 된다. 왜 import하냐고 묻는다면 설정파일을 분할하기 위해서다
나중에 여기에 여러 데이터를 집어넣는등 작업을 추가로 진행하면 유지보수하기 힘들어져서 분할해야한다.
이해가 잘 안된다고? 걱정마라 글쓰는 나도 잘 이해가 안간다. 그저 가슴으로 받아들이자 일단 한번 훑는게 중요하다!
그다음 생각할 것은 DBConfig 클래스에도 @con~을 추가한 후
@EnableTransactionManagement라는 어노테이션(@에다가 영어붙은거) 도추가해야한다. 이게 뭐냐고 묻는다면 트랜젝션을 추가하기 위해서 사용한다. 다음강의에서 약간 다룬다고 하니 이것도 가슴으로 받아들이자.
db연결 테스트를 해야하니 평소 db연결할때처럼 driver, url password 등을 변수에 대입한다.
위 사진을 보면 datasorce라는 것을 참조한다. 그래서 빈으로 만들어야한다.
그게뭐냐고 묻는다면 일단 코드를 보자
@Bean
public DataSource dataSource(){
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
뭔가 닮았다. 그렇다 db에 연결하기위해 우리가 그동안 작성했던 코드와 비슷하다.
즉 db에 연결하기 위한 소스라고 생각하면 편할것이다.
BasicDataSource라는 객체를 생성한다. 이 객체에 포함된 db연결 메소드들을 통해 db연결을 한후 리턴해준다.
아닐 수도 있지만 이 순간 받아들이는게 중요하다 그냥 맞다고 생각하자.
소스를 만들었으니 테스트를 해야한다.
메인패키지에 테스트클래스를 만든 후
applicationmContext 를 생성한 후 Applicationconfig클래스를 집어넣는다.
앞서만든 Datasource소스를 넣는다. 그후 connection객체생성후 테스트하면된다.
코드의 경우 사이트에 올라와있기 때문에 따로 설명할께 없는한 생략하겠다.
두 번째 생각 순서
테스트에 성공했다면 이제 다시 생각해야한다.
그림을 다시보자. 올려보기 귀찮을 테니 다시올리겠다.
뻥이다 올려봐라
딱 봐도 감이온다.
센터에 여기저기 발을 뻗치는 Dao를 만들면 된다.
Dao란 무엇인가? 데이터엑세스뭐시기로 데이터접근하는 클래스를 의미한다.
이건 그냥 우리의 약속 같은거라 select나 delete등의 메소드가 들어있는 건 dao로 만든다고 생각하면 된다.
하지만 쿼리문을 짜려면 데이터를 가져올수 있어야하기때문에 dto를 먼저 만들어야한다.
암기하자 dto만들고 dao
dto클래스는 getter setter와 tostring을 만든다. getter setter는 데이터를 가져오고 꺼내고 하기위해 만드는것이고
tostring은 데이터가 각각있는지 확인하기엔 귀찮으니 한번에 조회할 수 있게 만든것이다.
가방으로 예를들자면 가방에 연필 휴대폰 속옷 칫솔 이런걸 하나하나꺼냇다 집어넣으면서 확인하는것이 아니라
가방을 엎은뒤 한번에 다 본다고 이해하면 된다.
이제 미뤄둿던 dao를 만들자 dao에는 쿼리문이 들어간다.
단 여기서는 sql문들은 따로 sqls라는 클래스로 뺏다.
db를 조물락거리려면 당연히 dto에있는 메소드를 가져와야한다.
dao는 데이터를 수정삭제업데이트하는거니 저장을 의미하는 어노테이션
@Repository 을 사용한다. 여기다 붙이는 이유는 나중에
오토와이어드라는 것으로 한번에 읽어들이는데 그때 알아서 분류하기 위해서다. 그냥 받아들이자.
그림1을 보면 dao는 name~ 와 simple~을 이용한다. 근데 이것은 스프링에서 제공해주기 때문에 따로 클래스는 안만들어도 된다. 셀렉트구문을 수행하려면 name~에 query와 queryFor~등이 필요한데 이것을 사용하기 위해 이 객체를 선언해줘야 한다.
named파라미터는 보통 sql을 할때 ?를 사용해 바인딩 하는데 spring이 못알아먹을 수 있으니 이름으로 바인딩 할 수 있게 템플릿을 만든다고 생각하면 된다.
public RoleDao(DataSource dataSource) {
this.jdbc = new NamedParameterJdbcTemplate(dataSource);}
아까 dataSource를 return했는데 그 값을 네임드파라미터에 넣는다.
셀렉트올을 하려했으니 list로 dto를 받고 네임드파라미터에 있는 query를 사용해서 코드를 작성하면 된다.
그다음 applicationConfig에 conponentScan을 입력한후 메인클래스에 실행파일을 등록해서 마무리하면 된다.
마지막되서 짧아진듯한 이유는 귀찮아서다. 하지만 막판 버스트로 코드설명 한번 더 하고 마무리짓겠다.
@Repository
public class dao {
private NamedParameterJdbcTemplate jdbc;
private RowMapper<dto> rowMapper = BeanPropertyRowMapper.newInstance(dto.class);
public dao(DataSource dataSource){
this.jdbc = new NamedParameterJdbcTemplate(dataSource);
}
public List<dto> selectAll(){
return jdbc.query(SELECT_ALL, Collections.emptyMap(), rowMapper);
}
}
NamedParameterJdbcTemplate jdbc; 은 생략하겠다. 앞서말한 query메소드를 사용하기 위해서 저걸 선언해야한다.
RowMapper<Role> rowMapper = BeanPropertyRowMapper.newInstance(dto.class);
데이터를 읽는다. BeanPro~는 데이터를 한줄한줄 읽어서 rowMapper에 저장한다. dto.class를 넣어서 여기서 select로 가져온 모든 데이터를 rowMapper가 한줄한줄 읽어들인다고 생각하면 편하다.
여기서 db와 자바대소문자 틀린것도 조정해준다. 뭔말이냐면 강의들은 사람은 다 이해할것이다.
public List<dto> selectAll(){
return jdbc.query(SELECT_ALL, Collections.emptyMap(), rowMapper);
}
아까 내가 필요하다고 했던 query에는 3가지가 들어간다. 쿼리문, 값을담을 맵객체, 값을 읽어들이는 방식.
데이터를 한줄한줄 읽어들이기 위해 list타임으로 선언한 후 여기선 생략했지만 sqls에서 선언한 select_all 쿼리문을 넣고 다른 것도 넣고 마무리하면 된다.
그 후 테스트코드를 작성하고 마무리하면 된다.
글을 쓰다보니 전보다 이해가 더 잘되긴 했지만 지금도 저 사진보고 만들어보라고한다면 못만들 것 같다.
'IT > 부스트코스' 카테고리의 다른 글
부스트코스 -7 스프링MVC (8) | 2020.05.03 |
---|---|
부스트코스 웹앱개발 -5 스프링 (0) | 2020.04.28 |
부스트코스 웹앱개발 -3 Event delegation (0) | 2020.04.23 |
부스트코스 웹앱개발 -2 AJAX (0) | 2020.04.22 |
부스트코스 웹 앱 개발-1: 자바스크립트 배열 및 오브젝트 (0) | 2020.04.01 |