Spring_DB연동 및 CRUD 게시판(기초)

SG Jang·2021년 2월 19일
0

길잡이를 자바보자

목록 보기
8/12
post-thumbnail

이번 시간에는 "Spring_DB연동 및 CRUD 게시판(기초)"에 대해 다뤄보겠습니다.


기술버전

  • Spring 3.2.18
  • Java 1.8 (=JAVA 8)
  • Tomcat 8.5.61
  • mybatis 3.4.5
  • mysql 8.0.23

사전 참고사항

MyBatis를 사용하기 위해선 mybatis / mybatis-spring / spring-jdbc / spring-tx 총 4개의 라이브러리가 필요합니다.(pom.xml에 위 4개의 라이브러리가 있어야한다.) MyBatis-Spring은 스프링과 MyBatis 를 연동 시켜주는 라이브러리입니다. 스프링에서 MyBatis를 사용하는 구조는 다음과 같습니다.

spring-jdbc와 spring-tx는 스프링에서 데이터베이스 처리와 트랜잭션 처리를 하는 라이브러리입니다. MyBatis와 무관해 보이지만 추가하지 않은 경우에는 에러가 발생하기 때문에 추가해줍니다.
(트랜잭션이란? 간단하게 설명하자면 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위이다. 이를테면 select,insert,delete,update와 같은 sql을 이용하여 데이터베이스를 접근하기 위해 수행하는 작업의 단위라 이해하면 좋을것 같다.)

아래 그림은 1번에서 나올 DataSource, SqlSessionFactoryBean, SqlSessionFactory, SqlSessionTemplate, SqlSession 등의 복합적인 관계를 이해하는데 도움이 될거라 생각되어 첨부한다.


0. Mysql에서 테이블을 만든다.

1. resources 폴더에 mybatis폴더를 생성하고 그 하위에 config.xml파일을 만든다.

resources폴더는 자바 클래스에서 사용하는 리소스(자원)를 보관하는 곳입니다. DB연결을 위한 자원, 의존성 주입(DI)을 위한 xml 파일 등 자바 코드 외 모든 자원은 이곳에 넣어주면 됩니다. 우리는 이번시간에 config.xml이란 파일을 만들어 DB연결을 하고자 한다.

  • <mybatis:scan>이라는 태그를 붙인다.
    MyBatis가 동작할때 mapper를 인식할 수 있도록 <mybatis:scan>이라는 태그를 붙이고, 지정된 패키지(mapper)의 모든 MyBatis 관련 어노테이션을 찾아서 처리한다.

  • Datasource 객체 만들기
    (비유하자면 원자재)
    dataSource bean 을 선언하여 DI를 받을 수 있도록 설정한다. dataSource bean 은 spring-jdbc 모듈에 있는 클래스(org.springframework.jdbc.datasource.DriverManagerDataSource)를 이용하여 JDBC 드라이버를 통해 MySQL 서버에 접속할 수 있게한다. url은 mysql의 test데이터베이스에 연결한다는 뜻이고, username과 password에 mysql에서 사용하는 정보를 입력해준다.

  • sqlSessionFactory객체를 만든다.
    (비유하자면 원자재(데이터소스)를 참조하는 공장)
    Mysql 서버와 MyBatis를 연결해주는건 SqlSessionFactory라는 객체이다. 이 객체가 DataSource를 참조하여 MyBatis와 Mysql 서버를 연동시켜준다. SqlSessionFactory는 데이터베이스와의 연결과 SQL 실행에 대한 모든 것을 가진 가장 중요한 객체이다. 우리는 SqlSessionFactory를 생성하기 위해 SqlSessionFactoryBean이라는 클래스를 만들게 된다.

  • SqlSessionTemplate를 만든다.
    SqlSessionTemplate은 마이바티스 스프링 연동모듈의 핵심이다. SqlSessionTemplate은 SqlSession을 구현하고 코드에서 SqlSession를 대체하는 역할을 한다. SqlSessionTemplate은 생성자 인자로 SqlSessionFactory를 사용해서 생성될 수 있다. 아래 그림처럼 말이다.

2. dispatcher servlet

  • <mvc:annotation-driven/>을 추가해준다. (DB연동에서 다룰 부분은 아니지만, 프로젝트에 추가하지 않았으므로 겸사겸사 쓴다...)
    • 스프링 MVC 컴포넌트들을 그것의 디폴트 설정을 가지고 활성화하기 위해 사용된다.
    • 이 태그는 Spring MVC가 @Controller에 요청을 보내기 위해 필요한 HandlerMapping과 HandlerAdapter를 bean으로 등록한다.
      • 이렇게 등록된 bean에 의해 요청 url과 컨트롤러를 매칭할 수 있다.
      • 또한 컨트롤러(@Controller)에서는 @RequestMapping, @ExceptionHandler 등과 같은 주석을 통해 해당 기능을 사용할 수 있도록 한다.
      • 근본적으로 @Controller 없이는 이 태그는 아무것도 하지 않는다고 할 수 있다.
      • bean을 생성하기 위해 xml 파일에 context:component-scan을 명시하면 이 태그를 포함하지 않아도 MVC 애플리케이션은 작동한다.
    • RequestMappingHandlerMapping?
      요청 url과 매칭되는 컨트롤러(@Controller)를 검색하는 역할. 즉, 요청 url을 보고 어떤 컨트롤러가 처리할지 결정한다.
    • RequestMappingHandlerAdapter?
      컨트롤러의 실행 결과(요청을 처리한 결과)를 리턴하는 역할. Annotation 기반의 Controller 처리를 위해 반드시 필요하다.

3. web.xml에 config.xml을 추가해준다.

web.xml의 context-param > param-value에 config.xml을 넣어준다. classpath*:mybatis/config.xml, 이걸 넣는 이유는 web.xml이 WebApplication이 시작할때 가장 먼저 읽혀서 메모리에 올라가기 때문이고 config.xml도 읽어주기 위해서 이걸 적어주는 것이다.

(왜 classpath:mybatis/config.xml냐?
classpath: 접두사는 접두사 이후의 경로를 src와 resources 순으로 찾는다. 와일드카드
를 사용해 여러 파일을 동시에 지정할 수 있기 때문에 매퍼 파일이 늘어나더라도 추가적으로 작성할 필요가 없다.

4. mapper를 작성한다.

mapper를 작성하는 방식에는 2가지 방식이 있다.
1. annotation방식
2. xml방식
위 두개중에서 복합적인 sql문을 사용하기 위해서는 xml방식이 자주 사용되고 비교적 단순한 annotation방식은 잘 사용되지 않는다. 하지만 이번글에서는 annotation방식으로 하였다.(나는 아직 뉴비니까.. ㅎㅎ;;;)

그리고 아래는 실제 비지니스로직을 수행할 컨트롤러이다.
(private TestMapper testMapper; 에서 testMapper에 빨간 밑줄이 그어져 있다. 이런 현상이 일어나는 이유는 빈으로 등록되지 않아서기 때문이고, 이 정보를 IDE가 알려주는 것인데 실제로 돌려보면 잘된다. 계속 신경쓰인다면 Mapper에 @Repository 를 추가하면 된다. 더 자세한 설명은 여기를 참고하자.)


결과화면


참고자료

0개의 댓글