2022. 10. 19. 22:39ㆍ3층 1구역 - 개발의 장/Spring
1. 서론
이전에 말했던 DAO 간단화 작업을 해보고자 한다.
스프링 설정때와 마찬가지로 해주어야 할 밑준비가 많으니
잘 따라하여 DB연결에 성공해보도록 하자.
2. 본론
2-1. 커넥션 풀??
'커넥션 풀' 이라는 단어에도 정확한 뜻이 있겠지만, 그냥 '치고 빠지는 녀석' 이라고 생각하면 될 거 같다.
무슨 말이냐면 커넥션 풀을 설정함으로서 사용자가 DB에 접근을 하든 하지 않든 일단 미리 연결을 해둔다.
그 다음에 사용자의 요청이 들어오면 커넥션 풀이 DB에서 참조하여 만들어둔 정보에서 필요한 것을 주고 사용자와 연결을 끊기 때문에 DB에 직접 연결하는 거 보다 속도가 빠르다는 장점이 있다.
즉, 연결과 연결끊기 메서드를 따로 작성할 필요가 없어지는 것.
우리는 이 커넥션 풀을 사용해서 데이터베이스에 간접 연결을 하는 것을 경험해보고자 한다.
2-2. 설치하기
우리가 pom.xml에 임포트할 라이브러리?는 4가지가 있다.
실질적인 커넥션 풀 역할을 하는 HikariCP,
커넥션 풀을 쓰면서 외부 라이브러리를 쓰게 될텐데, 그때 처리 역할을 해주는 Spring jdbc,
쿼리문을 간결하게 작성하도록 도와주는 mybatis,
스프링에서 사용가능? 하도록 도와주는 mybatis-spring
구글에 먼저 'maven repository'를 검색해보자.
2-2-1. HikariCP
웹사이트에 접속하여 hikariCP를 검색하면?
가장 위에 뜨는 게 있는데 클릭하자.
클릭하면 버전이 쫘르륵 나오는데 아무거나 클릭해보자.
얘네는 따로 깃허브 주소가 있으니 클릭하여 스크롤을 아래로 내려보면
이렇게 코드가 나열되어 있는데 자바버전에 맞게 복사하여 사용하면 된다.
필자는 1.8버전인 8버전이므로 8버전 코드를 복사해 가겠다.
복사한 코드는 pom.xml에서 dependencies 태그 안쪽에 해당 코드를 붙여넣기 하면 된다.
2-2-2. spring-jdbc
다음은 spring-jdbc이다.
동일하게 검색창에 spring jdbc라고 쳐보자.
가장 위에 있는거 클릭!
이번에도 버전이 쫘르륵 나올텐데
그냥 아무거나 클릭하자.
필자는 5.3.23버전을 클릭해봤는데 상관없다 메이븐 코드 복사하여 dependencies 태그 안 붙여넣기 하자.
왜 상관이 없다라고 했냐면 version에
${org.springframework-version} 이 코드를 붙여넣기 할 계획이다.
해석을 부여하자면?
"현재 자바스프링 프레임워크의 버전과 동일하게 설정해줘." 라는 뜻이다.
2-2-3. mybatis
얘가 쪼매 어렵다.
홈페이지에선 최신버전으로 업데이트가 되어 있긴 한데....뭔가가 뭔가다... 잘 안 맞아;;
일단 mybatis 홈페이지가 있으니 들어가 보도록 하자.........라고 할뻔
구글에 mybatis 버전이라고 검색을 하면
저런 링크가 보이는데 클릭하면
이런 화면이 나온다.
필요조건을 보아하니
자바8버전 이상일 경우 스프링 프레임워크 버전은 5.0이상, mybatis는 3.5버전 이상 mybatis-spring은 2.0버전 이상이라고 한다.
mybatis는 3.5버전을 가져가도록 하자.
가장 최신으로 나온 3.5.11버전을 복사하여
붙여 넣고 위 이미지에 나와 있듯이 mybatis spring도 검색하여 2.0버전 이상을 복사해서 붙여넣도록 하자.
다 했으면 세이브 한번 해주시고.....
maven Dependencies를 한번 확인해보자
제대로 들어온 것을 확인할 수 있다. alt+F5를 눌러 최종 저장하고....
2-3. DB연결하기
이제 커넥션 풀을 통해 DB에 연결해보도록 하자.
연결하는 방법은 .xml파일을 통해 연결하는 방법, .java파일을 통해 연결하는 방법 2가지가 있는데
우선 여기선 .xml파일로 연결하는 것을 알아보도록 하자.
해당 경로로 root-context.xml파일을 클릭해보자.
필자는 해당 파일에 코드가 담겨있지만 처음에는 담겨있지 않을 것이다.
먼저 코드 작성 전에 코드 적는 창 하단을 보면
이런 칸을 볼 수 있는데 Namespaces를 클릭해보자.
클릭하면 위와 같은 창이 뜰텐데 잘 따라왔다면
mybatis-spring이란 것을 볼 수 있다. 체크하도록 하자.
체크하게 되면 저 체크한 것에 관한 자동 완성을 볼 수 있다.
??? : 그러면 저거 다 체크하면 되지 않음?
이럴 수 있는데?
가능하다. 원하면 그렇게 해도 된다. 다만 굳이 그렇게 해야 하나?
라는 생각은 든다.
어쨋든 체크하고 다시 Souce 창으로 돌아와 다음 코드를 작성하면 된다.
root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- 히카리 커넥션 풀을 사용하기 위한 bean코드 작성 시작 -->
<bean class="com.zaxxer.hikari.HikariConfig" id="hikariConfig">
<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="오라클 시스템 혹은 권한받은 아이디"/>
<property name="password" value="오라클 설치시 설정한 비밀번호"/>
</bean>
<!-- 히카리 커넥션 풀을 사용하기 위한 bean코드 작성 끝 -->
<!-- 히카리 커넥션 풀을 불러오기 위한 데이터소스 시작 -->
<bean class="com.zaxxer.hikari.HikariDataSource" id="dataSource">
<constructor-arg ref="hikariConfig"/>
</bean>
<!-- 히카리 커넥션 풀을 불러오기 위한 데이터소스 끝 -->
<!-- 데이터 소스 마이바티스에 등록 및 xml 파일 위치 설정 시작 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sessionFactory">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml" />
</bean>
<!-- 데이터 소스 마이바티스에 등록 및 xml 파일 위치 설정 끝 -->
<!-- 마이바티스 xml파일과 dao빈 연결 -->
<mybatis-spring:scan base-package="com.care.db.basic.repository"/>
</beans>
해당 코드는 계속 쓰이게 될테니 해당 파일은 백업해 두었다가 붙여넣기 하면 편하지 않을까 생각된다.
하지만 이걸 처음보는 사람이 있다면 친해지는 과정으로 한번쯤은 작성해보길 바란다.
testMapper.xml
이제 Mapper를 작성해볼건데 여기서 주의해야할 점이 있다.
위에서 DB연결할 때
<property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml" />
이 코드가 있는데 ' * ' 이 있는 곳은 어떠한 경로를 만들어도 상관없다.
mappers 라는 폴더 하위에만 있으면 된다.
그리고 *Mapper.xml 이라고 있는데 '별'에는 무슨 단어가 들어가도 상관없다.
member면 member, test면 test 다 넣어도 되는데 그 뒤로 오는 Mapper.xml이라는 이름은 준수해야한다.
그래야 Mapper가 정상적으로 읽힌다.
필자는 아래와 같이 만들었다.
Mapper에 코드를 작성하기 전에 먼저 DAO부터 살펴보자.
DAO는 이제 class가 아니라 interface로 파일을 만들어야 한다.
아 맞다.
그 전에...root-context에서 맨 아래에 이런 코드가 있을텐데
<mybatis-spring:scan base-package="com.care.db.basic.repository"/>
base-package에 적어주는 것은 DAO가 있는 패키지명을 적어주면 된다.
그러면 만들어보자.
IMemberDAO.java
package com.care.db.basic.repository;
import java.util.ArrayList;
import org.springframework.stereotype.Repository;
import com.care.db.basic.dto.MemberDTO;
@Repository
public interface IMemberDAO {
// 매개변수는 무엇인지(MemberDTO에 dto나 String id에 id 같은...)
// 반환값은 뭔지(void인지 String인지 int인지)
public void register(MemberDTO dto);
public MemberDTO login(String id);
public ArrayList<MemberDTO> list();
public void update(MemberDTO dto);
public void delete(String id);
}
어노테이션 Repository는 기존에 MemberDAO에 있던 것을 지우고
위 코드에 붙여넣는다.
Service.java에서도 @Autowired로 설정했던 MemberDAO를 IMemberDAO로 바꿔준다.
@Service
public class MemberService {
@Autowired
private HttpSession session;
@Autowired
private IMemberDAO dao;
그러면 Mapper.xml로 진짜 가보도록 하자.
mybatis를 사용할 수 있게끔 잡아주는 인스톨러가 있는데 현재는 모종의 오류로 사용이 불가하기 때문에
먼저 이 코드를 Mapper에 붙여넣자
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
그리고 코드를 작성한다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.care.db.basic.repository.IMemberDAO">
<insert id="register" parameterType="com.care.db.basic.dto.MemberDTO" >
INSERT INTO db_basic VALUES(#{id},#{pw},#{name},#{email})
</insert>
<select id="login"
parameterType="String"
resultType="com.care.db.basic.dto.MemberDTO">
SELECT * FROM db_basic WHERE id=#{id}
</select>
<select id="list" resultType="com.care.db.basic.dto.MemberDTO">
SELECT * FROM db_basic
</select>
<update id="update" parameterType="com.care.db.basic.dto.MemberDTO">
UPDATE db_basic SET pw=#{pw},name=#{name},email=#{email} WHERE id=#{id}
</update>
<delete id="delete" parameterType="String">
DELETE FROM db_basic WHERE id=#{id}
</delete>
</mapper>
IMemberDAO에서
회원 가입 코드가 다음과 같다면
public void register(MemberDTO dto);
parameterType은 소괄호에 있는 것을 적어주면 된다.
MemberDTO니까 DTO가 들어가있는 패키지 경로를 적어주면 된다.
resultType에는 변환값에 대해 적어주면 된다. void나 int형은 생략이 가능한 거 같다.
String일 경우 적어주도록 하자.
2-4. 테스트
이제 연결되었는지 테스트를 진행해보자 지금 바로 서버부터 켜보자
따로 warn이나 에러가 같은게 보이지 않는다면 연결은 성공이다.
인덱스 페이지 잘 뜨고....
현재 DB내역에 데이터가 없으니 회원가입을 해보자.
비밀번호는 1111로 설정해보았다.
가입 성공했고 DB를 확인하면?
오오ㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗㅗ!!
회원가입은 성공적으로 되었다.
로그인도 제대로 진행됐고?
수정도 해보았는데 DB확인해보면?
정상 작동된당~~~~
삭제도 해보자
전부 정상 작동 되니 DB가 잘 작동 되는 것을 확인할 수 있다.
3. 결론
이번에는 DB를 좀 더 간결하게 해보았다.
또 초면인 분이라 얼굴(?) 익숙해지는데에 한참 걸릴 듯 싶지만....
그래도 익숙해지면 편안할 거 같긴 하다
'3층 1구역 - 개발의 장 > Spring' 카테고리의 다른 글
Spring - 개인적으로 이용할 모든 코드 백업하기 (2022-10-19) (0) | 2022.10.19 |
---|---|
Spring - 커넥션 풀(java파일 이용하기)을 이용하여 데이터베이스 연결하기 (2022-10-19) (0) | 2022.10.19 |
Spring - 회원 목록만 확인할 수 있는 페이지 구현하는 퀴즈(2022-10-18) (1) | 2022.10.19 |
Spring - DB에 저장된 데이터로 로그인하는 퀴즈(2022-10-18) (0) | 2022.10.18 |
Spring - 세션을 이용하여 로그인해보는 퀴즈(2022-10-18) (0) | 2022.10.18 |