'mybatis'에 해당되는 글 1건

  1. 2015.09.20 [Spring] 05. Spring + myBatis 설정

[Spring] 05. Spring + myBatis 설정

개발공부/Spring 2015. 9. 20. 18:08

안녕하세요~ 오늘은 이전시간에 말했던것처럼 myBatis를 해볼까합니다.

지금 인터넷찾아보고 설정하면서 실시간으로 작성하는중인데

과연 오늘안으로 할수있을지 걱정입니다..ㅋㅋ


저번주(2015-09-13)에 여기까지 작성하고 내가 이걸 해도되나 생각좀 해보다가 오늘(2015-09-20)에서야 올려요ㅠ

아무래도 보고나서 하는거다보니 좀 캥겼나봐요ㅠ


이제 진짜 시작하겠습니다!!



1. 설정


1-1. 파일구조



빨간 점이 찍혀있는 파일 및 폴더는 이번에 설정하면서 수정 혹은 생성되는 파일들입니다.


1-2. pom.xml


일단 pom.xml에 아래와 같은 dependency를 추가해줍니다.


저는 mysql로 작업중이라서 mysql을 추가했는데, 각자 사용하시는 DBMS에 맞게 추가해주세요!!


1-3. root-context,xml


다음으로는 root-context,xml입니다.


자 위에서부터 설명을 좀 해보면, db properties부분은 db의 정보를 설정하는 부분인데, 저는 다른곳에 properties파일을 만들어서 따로 저장해두었습니다. 그래서 거기서 정보를 읽어오는데, 그에대한 설정은 <bean>안에 <property>에서 파일위치를 알려줘서 거기서 가져오도록 하였습니다. 이부분을 해주지 않으면 아래 dataSource 설정할때 위 소스처럼 사용이 불가능합니다. 해주지 않으면 ${..} 대신에 정보를 직접 입력하셔도 됩니다.


db.properties 내용입니다.



위에서 '=' 왼쪽부분이 id처럼 사용됩니다.


자 그아래 dataSource부분!! 위에 properties에서 읽어온 정보를 적용시켜주면서 DB의 정보를 설정해주는 부분이에요. 위 소스보다 dataSource가 더 중요한부분입니다. 각자 자신이 사용하는 DBMS에 맞는 드라이버와 URL 및 계정정보를 입력해주시면 됩니다. 해당 빈에 id를 추가해주세요. 이 id는 그 아래 설정에서 사용하게 됩니다.

DB에 대한 정보를 계속 입력하지 않고, 한번 설정한 다음에 id를 부여해서 해당 id를 찾아가서 설정된 속성들을 가져오기때문에, 이부분(id)은 괜히 오타내지 마시고 복붙하시는게 좋다고 생각됩니다.


다음으로 transactionManager 입니다.

이름만 들어도 트랜잭션 관리를 하는 녀석인데.. DB에 대한 정보를 필요로하는것같습니다.

위에서 설정해준 id를 ref부분에 입력해주시면 됩니다.


그다음 sqlSessionFactory 입니다.

dataSource부분은 넘어가겠습니다.

그 아래 보시면 configLocation이 있습니다. 이름만봐도 알수있는 설정파일 위치입니다.

저기서 자주쓰는 자료형같은것들을 미리 설정해주면 나중에 parameter나 result를 념겨주고 가져오는데 좋습니다.


mybatis-config.xml 파일을 보겠습니다.



자 왼쪽에 type에 보면 java.부터 해서 마지막까지 주르륵 쓰여있습니다.

오른쪽에는 alias라고해서 짧게 정의되어있어요. 

이게 무슨말이냐 하면, alias를 작성해면 alias에 해당하는 type을 사용한다는 의미입니다.

값을 주고받을때 원래는 type에 있는 내용을 다 작성해야하는데 언제 java.부터 치고있어요ㅠ


다음은 mapperLocations 입니다.

실제도 돌리는 sql파일들을 말하는겁니다.

저같은 경우는 해당 패키지 안에있는 xml파일들 전체를 설정하였습니다.


마지막으로, typeAliasesPackage 입니다.

value를 보시면 vo가 들어있는 패키지로 설정되어있습니다.

이게 뭔지 말씀드리자면, 한마디로 설정한패키지 안에있는 (vo패키지 안에있는) 파일들에 대해서 configLocation 에서 설정한것처럼 alias를 부여해주겠다는 의미입니다.

그런데 보시면 따로 alias에 대한 이름은 없습니다. 저 패키지안에 뭐가 얼마나 들어갈지 모르는데 그걸 어떻게 미리 alias를 지정할수있을까요ㅠ 그럼 어떻게하느냐? 해당 class파일명으로 alias가 됩니다.

mybatis-config.xml <typeAlias> 내용을 생각하시면 이해가 빠릅니다.

그냥 딱 저것처름 된다는거라서,, 뭐라고 더 설명할게 없어요ㅠ


마지막은 sqlSession인데...

sqlSessionFactory 의 정보를 갖고 세션관리를 한다고만 알고있습니다... 정확히는 저도 더 공부를 해봐야해요ㅠ



1-4. servlet-context,xml


위에 root-context 하다가 시간을 다보냈어요..ㅠ 이렇게 오래걸릴줄이야ㅠ

역시 아는거랑 설명하는거랑은 차이가 크네요ㅠ

다음 보겠습니다ㅠ!



바로 이야기해볼께요.

처음 component-scan 부분에 보시면 base-package가 보입니다.

해당 패키지안에 있는 class파일들을 스캔하여 bean으로 등록해줍니다.

모든파일을 등록하는것이 아니라, '@Controller''@Component'등의 어노테이션이 붙은 친구에 한해서 말이죠.


annotation-driven transaction-manager

1-3에서 설정한 transactionManager를 기반으로 트랜잭션을 관리해주는것이라고 생각됩니다.

이부분은 계속 찾아보면서 공부하고있는데 아직 확립이 잘 안돼요..ㅠ


2. 구현


2-1. controller


자 이제 실직적인 구현부분입니다.

controller 먼저 보겠습니다.



빨간점 부분만 보시면됩니다.

나머지는 이전시간에 하던작업이랑 다른게 없어요.


이렇게 service를 등록해줍니다.

하지만 따라하시는분들은 service가 없을꺼에요.

괜찮아요 이제 만들꺼니까 ㅋㅋ



2-2. service



이렇게 인터페이스를 만들어줍시다.

여기에 인터페이스를 만들고 구현은 좀 뒤에 하겠습니다.


2-3. mapper



이렇게 mapper를 작성해줍니다.

역시 빨간점부분을 신경써서 보세요.


2-4. serviceImp





자, servicemapper를 모두 만들고 난 후에 실제 구현을 해보겠습니다.

역시 빨.간.점!! 신경써서 보세요.

저는 처음에 할때 몇부분 빼먹어서 안된다고 징징대다가 혼나적이 한두번이 아닙니다....ㅠㅠ


service로 등록해주시고, 트랜잭션 처리를 위해 '@Transactional'을 적어줍니다.

'@Transactional'은 method 단위로도 사용 가능합니다.

그다음에 아까만든 service를 구현합니다.

구현하면서 DB에 접근할때 mapper를 사용하여 접근합니다.


그런데 DB에 접근해서 주고받고 한다고 하는데.. 저희는 sql을 작성한적이 없어요.

어디서할까요??



2-5. sql




자 여기가 제일 중요한거같은데요.. 위에서 막 설정하고 그런거 여기 다나와요ㅠ


설명은 빨.간.점 기준으로 하겠습니다.


맨먼저 '<mapper>'를 보겠습니다.

'namespace'를 보시면 특정 mapper를 지정하였습니다.

저 mapper는 아까 인터페이스로 만든 mapper입니다.

위에서 만든 mapper에서 메소드명이 sql파일에서 id가 됩니다.

'<insert>'안에 'id' 보이시나요? 위로 올려서 mapper부분 보시면 메소드명이랑 일치합니다.

둘이 일치하지않으면 에러나요ㅠ 꼭 일치시켜 주세요ㅠ


다음으로 보시면 'parameterType'이 보입니다. 저부분이 아까 1-3. root-content.xml에서 sqlSessionFactory의 typeAliasesPackage를 설정해서 저렇게 간단히 사용가능한겁니다. 만약 그렇게 안했으면, com.contk.vo.HallCommentVO' 이걸 전부 입력했어야 합니다. 패키지명까지 전부 말이죠.


그 다음으로 3번째 'resultType''Integer' 보이시나요? 이건 1-3. root-content.xml에서 sqlSessionFactory configLocation을 설정해논 덕분에 'Integer' 로 사용이 가능한겁니다.


자 마지막입니다.

'${id}' 보이시나요?? 저건 'HallSeatGradeVO' 안에있는 변수명입니다.

'serviceImp'에서 로직을 구현하면서 설정한 값이 들어갑니다. 자료형에 맞에 알아서 들어가니까 저렇게 써주시면 됩니다. 숫자일경우 ''없이 알아서 들어갑니다.




혼자 대충이해하고 말때는 금방인데 설명하려니 정말 다르네요.

크게 신경안쓰던것도 신경쓰면서 공부하게되고... 블로그 하길 잘한거같아요.

설명은 1차적으로 잘까먹는 저를위해 하는것도 있어요ㅠㅠ


다음번에는 스프링 시큐리티를 해볼까요!!

사실 지금까지 작성한건 이전에도 대충이라도 한두번 해봤던거라서 좀 나았는데 시큐리티 잘 할수있을지 ㅋㅋ

뭐 구글링을 잘 하면 되겠죠 ㅋㅋ 보시면서 도움이 되는지 모르겠네요 지극히 주관적으로 이해하고 그대로 작성하다보니... 틀린부분은 알려주시면 감사하겠습니다.


그럼 이만적고, 다음에 봐요!!






: