๐ service, dao ์์ฑ, Mybatis ์ค์น ํ mapper ๊ณต๋ถ
#230424
๐ป ์์ ํ์ผ
[src/main/java] - [edu.kh.comm.member.service] - MemberService.java(์ธํฐํ์ด์ค)
[src/main/java] - [edu.kh.comm.member.service] - MemberServiceImpl.java(ํด๋์ค)
[src/main/java] - [edu.kh.comm.member.dao] - MemberDAO.java
[src/main/java] - [edu.kh.comm.member.controller] - MemberController.java
์๋น์ค 2๊ฐ (์ธํฐํ์ด์คver, ํด๋์ค ver) ๋ง๋ค๊ธฐ
MyBatis ์ค์ ํด์ฃผ๊ธฐ (์ค์ ํ๋ ๋ฐฉ๋ฒ ํฌ์คํ ์ด๋)
dao, mapper ์ด์ฉํด์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์ด์ฉ
์ธํฐํ์ด์ค๋ ์ธํฐํ์ด์ค ์์ฒด๋ง์ผ๋ก ๊ฐ์ฒด ๋ง๋ค์ด์ ์ฌ์ฉ ๋ถ๊ฐ
์์๋ฐ์ ์ธ MEMBERSERVICE IMPL ํด๋์ค๋ฅผ ๋ง๋ฌ
์คํ๋ง์์ ์ค๋ฌด๋๊ฐ๋ฉด DAO๋ CONTROLLER๋ ํ์์ ์ ํ๋๋ก ํจ
service๋ ๋๋ถ๋ถ ์ด๋๋ฅผ ๊ฐ๋ ๋๋จ๊ณ๋ก ๋๋ ์ ์
ํ๋ก์ ํธ์ ๊ท์น์ฑ์ ๋ถ์ฌํ๊ธฐ ์ํด์
Spring AOP ๋ฅผ ์ํด์ ํ์
ํด๋์ค๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ์ฝํ(๋์จํ๊ฒ) ์ํค๊ธฐ ์ํด์ -> ์ ์ง๋ณด์์ฑ ํฅ์ โญโญ
(๊ฒฐํฉ๋๋ ํด๋์ค์ ํด๋์ค๊ฐ์ ๊ด๊ณ, ์ผ๋ง๋ ๋ง์ด ์ฐ๊ฒฐ๋์ด ์๋์ง
ํด๋์ค๊ฐ์ ์ฐ๊ฒฐ์ด ๋ง์ผ๋ฉด ์ ์ง๋ณด์๊ฐ ํ๊ธฐ ํ๋ฌ๐ญ๐ญ)
ํธ๋์ญ์
, ๋ก๊น
, ๋ณด์ ๋ฑ ์ฌ๋ฌ ๋ชจ๋, ์ฌ๋ฌ ๊ณ์ธต์์ ๊ณตํต์ผ๋ก ํ์๋ก ํ๋
๊ธฐ๋ฅ์ ๊ฒฝ์ฐ ํด๋น ๊ธฐ๋ฅ๋ค์ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌ!
์์) classA์ 2๋ฒ๊ณผ b์ 2๋ฒ๊ณผ ๊ฐ๋ค๋ฉด ๊ฐ์ด ์ฝ๋ ์์ ํด์ค์ผํจ.
๊ฐ์ ์ฝ๋์ธ๋ฐ ๊ฐ์ ํด๋์ค์ ๋๋ ์ ธ ์์ผ๋ฉด ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ ๐ AOP์ ํฉ์ด์ง ๊ด์ฌ์ฌ
๊ทธ๋์ ํฉ์ด์ง๊ด์ฌ์ฌ(2๋ฒ,3๋ฒ ๋ฉ์๋)๋ฅผ ํ๋๋ก ๋ฌถ์ด์ ์ฌ์ฉํ๋ค ๐ ๋ชจ๋ํ๋ฅผ ํ๋ค
[AOP ํฉ์ด์ง ๊ด์ฌ์ฌ] : ์์ค์ฝ๋ ์์์ ๊ณ์ ๋ฐ๋ณตํด์ ์ฌ์ฉ๋๋ ๋ถ๋ถ๋ค
โก๏ธ ์ ์ง๋ณด์๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ ๋ค
<< MemberController ํด๋์ค >>
public class Member Controller {
private Logger logger = LoggerFactory.getLogger(MemberController.class);
// private MemberSErvice service = new MemberServieImpl();
@Autowired
private MemberService service ....
--------------------------------------------------------------------------------
<< ServiceImpl ํด๋์ค >>
@Service
public class MemberServiceImpl implements MemberService {
์คํ๋ง์ ๊ฒฝ์ฐ ํน๋ณํ ๊ฒฝ์ฐ ์๋๋ฉด new์ฐ์ฐ์ ํตํด์ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ฐ์ฒด์์ฑ ์ํจ
์ปจํธ๋กค์ ์ ์ด๊ถ์ด ๊ฐ๋ฐ์๊ฐ ์๋๋ผ ํ๋ ์์ํฌ์ ์๋ค๋ ๋ป์ผ๋ก
๊ฐ์ฒด์ ์์ฑ๋ถํฐ ๋ชจ๋ ์๋ช
์ฃผ๊ธฐ์ ๊ด๋ฆฌ๊น์ง ํ๋ ์์ํฌ๊ฐ ์ฃผ๋ํ๊ณ ์๋ค.
๋น์ฆ๋์ค๋ก์ง(๋ฐ์ดํฐ๊ฐ๊ณต, db์ฐ๊ฒฐ)์ ์ฒ๋ฆฌํ๋ ํด๋์ค์์ ๋ช ์ + bean ๋ฑ๋ก
์์์ฑ์ ๊ฐ์ง๋ DB/ํ์ผ๊ณผ ์ฐ๊ฒฐ๋๋ ํด๋์ค์์ ๋ช ์ + bean ๋ฑ๋ก
bean์ผ๋ก ๋ฑ๋ก๋ ๊ฐ์ฒด ์ค ํ์
์ด ๊ฐ๊ฑฐ๋, ์์๊ด๊ณ์ธ bean์ ์๋์ผ๋ก ์ฃผ์
(์ฐ๊ฒฐ)ํด์ค.
๐DI (์์กด์ฑ ์ฃผ์
)
์ด๊ฑฐ ์ฐ๋ ค๋ฉด Bean์ด ๋จผ์ ์ ํ๋์ด์ผํจ. ๊ทธ๋์ผ ์๋ํ๋๊น...
๋ชจ๋ ๋ฉ์๋๊ฐ ์ถ์ ๋ฉ์๋ (๋ฌต์์ ์ผ๋ก public abstract) ์ด๋ค
๋ชจ๋ ํ๋๋ ์์ (๋ฌต์์ ์ผ๋ก public static final) ์ด๋ค
<< MemberController ํด๋์ค >>
@PostMapping("/login")
public String login(@ModelAttribute Member inputMember) {
logger.info("๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์ํ๋จ");
Member loginMember = service.login(inputMember);
return "redirect:/";
}
---------------------------------------------------------------------------
<< MemberService ์ธํฐํ์ด์ค >>
public interface MemberService {
public abstract Member login(Member inputMember);
}
--------------------------------------------------------------------------
<< MemberServiceImpl ํด๋์ค >>
@Service
public class MemberServiceImpl implements MemberService {
// memberSErviceImpl์์ ๋นจ๊ฐ์ค ๋จ๋ฉด add unimplement ํด๋ฆญํด์
// ์ฌ์ ์(์ค๋ฒ๋ผ์ด๋ฉ)ํด์ฃผ๊ธฐ
@Autowired
private MemberDAO dao;
// ๋ก๊ทธ์ธ ์๋น์ค ๊ตฌํ
@Override
public Member login(Member inputMember) {
Member loginMember = dao.login(inputMember);
return loginMember;
}
--------------------------------------------------------------------------
<< MemberDAO ํด๋์ค >>
@ Repository
public class MemberDAO { ....
โก๏ธ Connection์ ์ป์ด์ค๊ฑฐ๋ / ๋ฐํํ๊ฑฐ๋ ํธ๋์ญ์
์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ตฌ๋ฌธ์ ์์ฑํ์ง ์์๋
Spring์์ ์ ์ด๋ฅผ ํ๊ธฐ ๋๋ฌธ์ Service ๊ตฌ๋ฌธ์ด ๊ฐ๋จํด์ง๋ค.
DAO๋ DB๋ ์ฐ๊ฒฐํ๊ธฐ ์ํ Connection์ด ๊ณตํต์ ์ผ๋ก ํ์ํ๋ค!
โก๏ธ ๊ธฐ์กด์ ํ๋์ ์ ์ธํด์ ์ / ์ด์ ๋ Mybatis ์ด์ฉ!Mybatis (์์์ฑ ํ๋ ์์ํฌ)๋ฅผ ์ด์ฉํ๋ ค๋ฉด Connection์ ์ด์ฉํด ๋ง๋ค์ด์ง ๊ฐ์ฒด
SqlSessionTemplate์ ์ฌ์ฉ
mybatis ์ค์น ํ sqlSessionTemplate ์ค๋ฅ ํด์ ํ์ธ ํ Autowired์ ํตํด
root-context.xml์ ์์ฑ๋ sqlSessionTemplate bean๊ฐ์ฒด ์ฐ๊ฒฐํด์ ์ฐ๋๊ฑฐ์
public class MemberDAO {
@Autowired // root-context.xml ์์ ์์ฑ๋ SqlSessionTemplate bean์ ์์กด์ฑ ์ฃผ์
(DI)
private SqlSessionTemplate sqlSession;
// SqlSessionTemplate importํ๋ ค๋ฉด mybatis ์์ ์๋๊ฑฐ๋ผ์ ๊ฑฐ๊ธฐ์ ์ค์ ํด์ค์ผํจ
private Logger logger = LoggerFactory.getLogger(MemberDAO.class);
public Member login(Member inputMember) { ....
๋ฐ์ดํฐ์ ์
๋ ฅ, ์กฐํ, ์์ , ์ญ์ (CRUD)๋ฅผ ๋ณด๋ค ํธํ๊ฒ ํ๊ธฐ ์ํด
xml๋ก ๊ตฌ์กฐํํ Mapper ์ค์ ํ์ผ์ ํตํด์ JDBC๋ฅผ ๊ตฌํํ ์์์ฑ ํ๋ ์์ํฌ
์ ์ฒดํ๋ก์ ํธ ํ๋ฆ์ด ์๋๋ผ dao์๋ค๊ฐ Mybatis ์ค์ ํ์ผ ์น์ด์ ์ธ๊ฑฐ์!
โ๋ฌด์กฐ๊ฑด ์๋ ์์๋๋ก ์ ์ด์ฃผ๊ธฐ. ํ๋ฆฌ๋ฉด ์ค๋ฅ๋๊ฑฐ๋ ์คํ์๋จ
<!-- SqlSessionTemplate ๊ด๋ จ ์ค์ -->
<settings>
<!-- insert / update ์งํ ์ null์ด ํฌํจ๋์ด์๋ ๊ฒฝ์ฐ
Mybatis๋ ๊ธฐ๋ณธ์ ์ผ๋ก error๋ฅผ ๋ฐ์์ํค์ง๋ง
ํด๋น ๊ตฌ๋ฌธ์ด ์์ฑ๋๋ฉด ์ง์ ๋ value๋ก ๊ฐ์ insert/update ์ํจ๋ค.
** ์๋ฌธ์ null์ ์ค๋ฅ ๋ฐ์!! ๋ฌด์กฐ๊ฑด ๋๋ฌธ์ NULL (๋ง์ด๋ฐํฐ์ค์์ ์ค๋ฅ๋ธ) **
-->
<setting name="jdbcTypeForNull" value="NULL" />
</settings>
<!-- ๋ณ์นญ ์์ฑ ๋ถ๋ถ -->
<!-- VOํด๋์ค์ ํจํค์ง๋ช
+ ํด๋์ค๋ช
๋ชจ๋ ์์ฑํ๋ ๊ฒ์ด ๋ถํธํ๊ธฐ ๋๋ฌธ์ ์งง์ ๋ณ์นญ ๋ถ์ฌ -->
<typeAliases></typeAliases>
<!-- SQL์ด ์์ฑ๋๋ mapper ํ์ผ ์์น๋ฅผ ๋ฑ๋ก -->
<mappers></mappers>
SqlSession : sql๊ตฌ๋ฌธ์ DB์ ์ ๋ฌ, ์คํํ๋ ๊ฐ์ฒด
SqlSessionFactory : SqlSession์ ๋ง๋๋ ๊ฐ์ฒด
sqlSessionFactoryBean : mybatis ์ค์ ํ์ผ(mybatis-config.xml)๊ณผ
Connection Pool ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ SqlSessionFactory๋ฅผ ๋ง๋๋ ๊ฐ์ฒด
sqlSessionTemplate : SqlSession ๊ฐ์ฒด์ ํธ๋์ญ์
์ฒ๋ฆฌ ์ญํ ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฐ์ฒด -->
1. ์ํํ๋ ค๋ SQL์ ๋ฐ๋ผ์ ํ๊ทธ๊ฐ ๊ตฌ๋ถ๋จ (์ฌ์ฉ ๊ฐ๋ฅํ ์์ฑ๋ ๋ค๋ฆ)
<select></select>
<insert></insert>
<update></update>
<delete></delete>
์กฐํ๋๋ ํ์ ๊ฐ์์ ๋ฐ๋ผ dao์์ ์์ฑ๋๋ ๊ตฌ๋ฌธ์ด ๋ฌ๋ผ์ง!!
๊ทธ๋์ 1ํ์ด๋ ์ฌ๋ฌํ์ด๋์ ๋ฐ๋ผ ๋ค๋ฆ
์กฐํ๋๋ ๋ฐ์ดํฐ์ ํ์ ์ ๋ฐ๋ผ์ ํ๊ทธ ์์ ์์ฑ๋๋ ์์ฑ์ด ๋ฌ๋ผ์ง
resultType : ์กฐํ ๊ฒฐ๊ณผ๊ฐ 1ํ 1์ด์ธ ๊ฒฝ์ฐ์๋ง ์์ฑ
์กฐํ๋ ๋ฐ์ดํฐ์ Java ์๋ฃํ์ Mybatis ๋ณ์นญ ํํ๋ก ์์ฑ
[mybatis ๋ณ์นญ]
java : mybatis
int : _int
Integer : int
String : string (java.lang.String)
<< member-mapper.xml >>
<!-- ์กฐํ๋๋ ํ์ ๊ฐ์ : 1ํ / ์กฐํ๋๋ ๋ฐ์ดํฐ์ ํ์
: intํ -->
<select id ="test1" resultType="_int">
SELECT COUNT(*) FROM MEMBER
</select>
<< MemberDAO >>
//1ํ ์กฐํ(์ ๋ฌ๋๋ ํ๋ผ๋ฏธํฐ X) ๋ฐฉ๋ฒ
// int count = sqlSession.selectOne("namespace๊ฐ.id๊ฐ");
// member-mapper.xml์ ์จ์์
// ์กฐํ๋๋ ํ์ ๊ฐ์๊ฐ ์ฌ๋ฌ๊ฐ๋ฉด sqlSession.selectList("namespace๊ฐ.id๊ฐ")
int count = sqlSession.selectOne("memberMapper.test1");
logger.debug(count + "");
์๋ฒ๋๋ ค์ ๋ก๊ทธ์ธํ๋ฉด console์ฐฝ์ ์๋์ฒ๋ผ ๋ฐ๊ฑฐ์
<< member-mapper.xml >>
<!-- ์กฐํ๋๋ ํ์ ๊ฐ์ : 1ํ / ํ๋ผ๋ฏธํฐ ํ์
: String / ์กฐํ๋๋ ํ์
: String -->
<select id="test2" parameterType="string" resultType="string">
SELECT MEMBER_NICK FROM MEMBER
WHERE MEMBER_EMAIL = #{memberEmail}
AND SECESSION_FL = 'N'
</select>
<< MemberDAO >>
// 1ํ ์กฐํ ( ํ๋ผ๋ฏธํฐ O) ๋ฐฉ๋ฒ
String memberNickname = sqlSession.selectOne("memberMapper.test2",inputMember.getMemberEmail());
logger.debug(memberNickname);
์๋ฒ๋๋ ค์ ๋ก๊ทธ์ธํ๋ฉด console์ฐฝ์ ์๋์ฒ๋ผ ๋ฐ๊ฑฐ์
โ์กฐํ ํ ๋ db๊ฐ ์ค๋ณต๋๋ฉด ์ค๋ฅ๋จ๋ ์ค๋ณต์๋๋๊ฑธ๋ก ์กฐํํ๊ธฐ