8/15/2019

스프링 게시판 만들기 #3. 스프링과 데이터 베이스 연동

데이터 베이스가 준비되었으니, 스프링과 데이터 베이스를 연동해주겠습니다. 이번 게시물의 내용은 스프링에 마리아 DB (+MySQL) 연동과 비슷하지만, 약간 다른 부분이 있어서 새로 작성했습니다.

데이터 베이스에서 만든 테이블과 같은 형태의 VO(Value Object)를 먼저 만들어 보겠습니다. 지금 당장 VO를 사용하진 않으나, 데이터 베이스를 만들면

src/main/java 패키지를 우클릭한 후 New → Package를 선택합니다.

이름(Name)에 com.board.domain을 입력하고 완료(Finish) 버튼을 클릭합니다.

com.board.domain 패키지가 생성되었습니다.

com.board.domain 패키지를 우클릭하고 New → Class를 선택합니다.

이름(Name)에 BoardVO를 입력하고 완료(Finish) 버튼을 클릭합니다.

VO의 이름은 특별한 규칙은 없으나, 역할명에 맞도록 작성해주시면 됩니다.

BoardVO가 만들어 졌습니다.

내부에 tbl_board 테이블을 만들 때 사용한 쿼리를 넣고 주석처리했습니다.

이렇게 하는 이유는 VO를 만들 때 테이블과 똑같이 만들어줘야하다보니 확인하기 쉽도록, 그리고 다른 사람이 이 VO를 보더라도 어느 테이블을 사용하는지 바로 알 수 있기 때문입니다.

하지만 그냥 주석을 걸어두기만 해도 되는거라, 굳이 이렇게할 필요는 없습니다.

테이블의 컬럼과 동일한 명칭과 데이터형으로 변수를 만들어줍니다.

private int bno;
private String title;
private String content;
private String writer;
private Date regDate;
private int viewCnt;

이렇게 작성하면 Date 부분에 자료형 에러가 발생하는데, Ctrl + Shift + O 를 누릅니다.

Java.util.Date를 선택하고 완료(Finish) 버튼을 클릭합니다.

그러면 방금 선택했던 자료형이 임포트(import)된걸 확인할 수 있습니다.

스프링 상단 메뉴에서 Source → Generate Getters and Setters를 선택합니다.

Select All 버튼을 클릭하고, 생성(Generate) 버튼을 클릭합니다.

모든 변수에 대한 Getter와 Setter가 생성되었습니다.

Getter와 Setter가 있어야 VO의 데이터를 사용할 수 있으므로, 이 작업은 필수입니다.

pom.xml파일을 열고, 하단 탭에서 pom.xml을 선택합니다.

</dependencies> 위에 코드를 추가합니다.

<!-- maria db -->
<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>2.3.0</version>
</dependency>

<!-- org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.1</version>
</dependency>

<!-- mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
</dependency>

<!-- spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

이 코드는 MavenRepository에서 찾을 수 있으며, 스프링과 마리아 DB(MySQL)의 연동을 할 수 있게 해줍니다.

src → main → webapp → WEB-INF → spring 에서 root-context.xml 파일을 열고, Namespaces 탭을 선택한 뒤 화면 처럼 beans, context, jdbc, mybatis에 체크합니다.

root-context.xml의 Source탭을 선택합니다.

데이터 베이스에 접속할 수 있도록 빈(bean) 코드를 추가합니다.

<bean
 class="org.springframework.jdbc.datasource.DriverManagerDataSource"
 id="dataSource">
 <property name="driverClassName" value="org.mariadb.jdbc.Driver" />
 <property name="url" value="jdbc:mariadb://127.0.0.1:3306" />
 <property name="username" value="kuzuro" />
 <property name="password" value="1111" />
</bean>

<bean id="sqlSessionFactory"
 class="org.mybatis.spring.SqlSessionFactoryBean">
 <property name="dataSource" ref="dataSource" />
 <property name="configLocation" value="classpath:/mybatis-config.xml" />
 <property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml" />
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
 <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

다른 코드는 수정할 필요가 없으나, username과 password는 자신의 데이터 베이스 설정에 맞도록 수정해야합니다.

마이바티스 설정을 위한 xml파일이 필요합니다.

src/main/resources를 우클릭하고 New → Other를 선택합니다.

xml로 검색하면 바로 찾을 수 있습니다. XML File를 선택하고 다음(Next) 버튼을 클릭합니다.

경로가 src → main → resoureces인걸 확인하고, 파일 이름(File name)에 mybatis-config을 입력한 뒤 완료(Finish) 버튼을 클릭합니다. 확장자(.xml)는 있든 없든 상관없이 생성됩니다.

만약, root-context.xml에서 마이바티스(mybatis) 설정 파일이름을 mybatis-config.xml이 아닌 다른 이름으로 했다면, 그 이름으로 해주시면 됩니다.

마이바티스 사이트를 참고하여 기본 코드를 입력합니다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

</configuration>

이번엔 매퍼(mapper)를 추가합니다.

src/main/resources를 우클릭하고 New → Folder를 선택합니다.

경로가 src → main → resoureces인걸 확인하고, 폴더 이름(Folder name)에 mappers을 입력한 뒤 완료(Finish) 버튼을 클릭합니다.

생성된 mappers 폴더를 우클릭하고 New → Other를 선택합니다.

XML File을 선택하고 다음(Next) 버튼을 클릭합니다.

경로가 src → main → resoureces → mappers인걸 확인하고, 파일 이름(File name)에 boardMapper를 입력한 뒤 완료(Finish) 버튼을 클릭합니다. 확장자(.xml)는 있든 없든 상관없이 생성됩니다.

마이바티스 사이트를 참고하여 기본 코드를 입력합니다.

<?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.board.mappers.board">

</mapper>

이때, 네임스페이스(namespace)는 각각의 매퍼를 구분하는 고유명이 됩니다.

프로젝트를 우클릭한 뒤 Runs As → Runs on Server를 선택하여 실행해봅니다.

root-context.xml에 등록한 빈(bean)에 맞는 마아바티스 설정 파일과 매퍼 폴더가 없는 경우, 즉 mybatis-config.xml과 mappers 폴더가 없는 경우 에러가 발생하며 프로젝트가 실행되지 않습니다.

프로젝트가 정상적으로 실행되었습니다. 이상 없이 잘 된것 같습니다.

게시물 수정
  1. 안녕하세요. 잘보았습니다.네임스페이스 설정에서 마이바티스와 JDBC가 없는 경우에는 어떻게 해야할까요?

    답글삭제
    답글
    1. 잘못체크했네요. 단순한 실수입니다 ㅠㅠ 해결했습니다,.

      삭제
  2. 익명4/13/2020

    네임스페이스에서 마이바티스와 jdbc 없는경우에는 무엇이 잘못된건가요???

    그대로 진행해도되는건가요???

    답글삭제
    답글
    1. 익명4/13/2020

      해결했습니다... 제실수였네요

      삭제
  3. 저는 mysql로 해서 일단 mysql로 바꿔서 했는데 왜 404 오류가 뜰까요.. controller 가용하지 않는다고 뜨네요

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      db와 별개로 컨트롤러에서 에러가 발생한다면
      컨트롤러에 어노테이션이 제대로 있는지, 컨트롤러와 컨트롤러 하위 메서드들의 매핑(주소)가 올바른지
      이클립스 사용시 톰캣 서버의 기본 url이 루트(/)인지 확인해보셔야 할 것 같습니다.

      삭제
  4. 컨트롤러에 어노테이션도 있고 그밖에 컨트롤러수정한게 없고 톰캣서버도 확인햇는데 이렇게 뜨면 어떤문제가 있는걸까요...??톰캣 Path값을 /주는거 맞죠!?

    설명 Origin 서버가 대상 리소스를 위한 현재의 representation을 찾지 못했거나, 그것이 존재하는지를 밝히려 하지 않습니다.

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      프로젝트를 클린해보시거나, 말씀하신대로 서버의 루트 컨텍스트를 / 로 해주시면 될것 같습니다.

      삭제
  5. 오라클로 연동하는것도 알려주실순 없나요 ㅜㅜㅋㅋ

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      확인이 늦어서 죄송합니다.
      말씀하신 오라클과의 연동은 스프링에 오라클과 마이바티스 연동에 있습니다.

      삭제
  6. mysql은 mariaDB와 같은 방식으로 연동하면 되나요???

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      mysql과 마리아db의 연동 방식은 동일합니다.

      삭제
  7. 깃허브연동도 되나요?ㅠㅠ 구글링중인데 그나마 이게 제일 비슷한것같긴한데ㅠㅠ제발 됐으면 좋겠네요 .. 서버랑 서버끼리는 연결해봤는데 깃허브에 있는 웹은 어케해야할지 ㅠㅠ

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      깃허브 연동도 가능합니다. 물론 위 게시물뿐만 아니라, 대부분의 ide에서 가능합니다.
      이 블로그에서는 이 게시물을 보시거나, 다른 사이트나 블로그를 참조하시면 될 것 같습니다.

      삭제
  8. 익명1/26/2021

    root-context.xml의 jdbc, context, mybatis 추가하는 부분에서 namespace탭이 안보이는데 추가로 설정해야 하는게 있나요 ??

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      게시물에 있는 STS 이후 버전의 경우, namespace탭이 없더군요.
      STS4에서 확인해보니 게시물에 있는 namespace에 체크하는거 없이도 코드만 넣어주시면 실행이 잘 됩니다.

      삭제
  9. 차근차근 따라해보면서도 오류 발생... 자세히 다시 하나씩 보면 무조건 조그마한 오타..

    나의 경우에 따르면 mybatis 해야하는데 my-batis 해가지고 오류 ..

    감사히 잘배웠습니다

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      이상하게 제가 낸 오타는 못찾겠더라고요(...)

      삭제
  10. bean 설정하는부분에서

    class="org.springframework.jdbc... > 영역에서

    오류가뜨는데
    the fully qulaified name of the bean's class, except if it serves only as a parent definition for child bean definitions.

    어디문제일까요

    답글삭제
    답글
    1. pom.xml 파일에서 org.springframework-version 확인해보셨나요

      삭제
  11. 너무 친절한 글 감사합니다.. 잘보고있습니다.

    답글삭제
  12. 익명7/14/2021

    저는 mysql로 적용해보고 있는데요
    위 글처럼 적용했다가 에러가 나서 수정중인데 잘 모르겠어서 질문드립니다. ㅠㅠ

    설정 내용








    오류내용

    WARN : org.springframework.context.support.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [D:\board\workspace\board\src\main\webapp\WEB-INF\spring\root-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.core.io.Resource[]' for property 'mapperLocations'; nested exception is java.lang.IllegalArgumentException: Could not resolve resource location pattern [classpath:/mappers/*.xml]: class path resource [mappers/] cannot be resolved to URL because it does not exist
    ERROR: org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@7ac7a4e4] to prepare test instance [com.board.controller.MySQLConnectionTest@77eca502]
    java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)

    답글삭제
    답글
    1. 익명7/14/2021

      D:\board\workspace\board\src\main\resources\mappers\boardMapper.xml
      D:\board\workspace\board\src\main\webapp\resources\mappers\boardMapper.xml

      아 위치가 달라서 그랬네요 해결!!!

      삭제
  13. 안녕하세요.

    root-context.xml 파일에서 Namespaces 탭에 jdbc, mybatis가 없는데.. 뭐가 잘못된 것일까요?

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      이클립스 또는 STS의 버전이 높은 경우 Namespaces에 없거나, Namespaces자체가 없을수도 있습니다.
      이런 경우 root-context.xml에 코드를 직접 입력하면 됩니다.

      삭제
  14. 404 에러가 떠서 여러가지로 확인을 해봤는데,
    알고보니 역시 디렉토리 설정을 잘 못 한거였습니다.
    board/src/main/resources 디렉토리에 했어야 했는데,
    board/src/main/webapp/resources에 생성했네요.
    차근차근 다시 글을 읽어보면서 수정했습니다.
    별거 아닌데도 많이 뿌듯하네요. 감사드립니다.

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      남이 오타낸건 잘 보이는데 저 스스로가 오타내거나 잘못 입력한건 이상하게 눈에 안보이더군요(...)

      삭제
  15. 여러분, 네임스페이스에서 뜨지 않을 때 Alt + F5로 메이븐 업데이트를 해보세요
    저도 이렇게 해결했습니다!
    글 올려주신 kuzuro님께 압도적 감사를 드림.

    답글삭제
  16. 익명8/11/2023

    혹시 아직도 해결 안되신분 에서 .xml 을 지우고 다시 해보세요~

    답글삭제
  17. 익명8/21/2023

    감사합니다 행복하세요 선생님 :)

    답글삭제
  18. 404에러가 떴는데, 혹시 콘솔 에러메세지에
    Description Resource Path Location Type
    The file cannot be validated as the XML definition "C:\Users\hyein\workspace-sts-3.9.11.RELEASE\board\src\main\java\log4j.dtd (지정된 파일을 찾을 수 없습니다)" that is specified as describing the syntax of the file cannot be located. log4j.xml /board/src/main/resources line 2 XML Problem
    이런 메세지가 있는데, 이게 문제인건가요...?

    답글삭제
  19. 감사합니다~

    답글삭제