ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 게시판 만들기(2) - Mapper설정.
    SpringBoot/게시판 (SpringBoot, H2,Mybatis,Thymeleaf) 2021. 1. 3. 22:26

    게시판 카테고리의 포스팅들은 IntelliJ, Gradle, SpringBoot, Mybatis, H2-Database, Thymeleaf를 사용해
    간단한 게시판을 만들어가는 포스팅입니다.

     

    이전의 포스팅에서 초기 세팅을 완료했으니, 이제 데이터베이스에 접근해 정보를 가져올 수 있는 Mapper설정을 시작합니다.

     

    Mybatis 설정하기

    프로젝트이름+Application class

    프로젝트에서 Mapper를 스캔할 수 있도록 @MapperScan 어노테이션을 사용하고, basePackages="패키지 경로"를 작성합니다. 이를 작성함으로서 프로젝트 하위에 있는 Mapper들을 빈으로 등록하고 인식할 수 있게 해줍니다.

     

    MapperInterface 생성하기

     

    프로젝트 이름 폴더 하위에 mapper라는 폴더를 생성 후 mapper폴더에 BoardMapper 이름을 가진 인터페이스를 생성합니다.

    boardMapper

    @Repository 어노테이션으로 해당 인터페이스가 저장소라는 것을 명시합니다. (MapperScan의 대상)

    이 인터페이스로 Mapper.xml를 통해 sql명령어로 데이터베이스에 접근할 수 있게됩니다.

    (메소드 이름은 Mapper.xml의 메소드 id와 같아야합니다.)

     

    각 메소드의 용도는 아래에서 설명하겠습니다.

     

    Mapper.xml 생성하기.

    다음 사진과 같이 resources폴더의 하위 폴더로 패키지 경로와 같은 폴더들을 생성한 뒤, mapper 폴더를 생성 후

    BoardMapper.xml 파일을 생성해줍니다. ( 위에서 생성한 Mapper Interface와 동일한 경로를 가져야함 )

     

    폴더

    그 후 xml파일은 아래와 같은 코드를 작성해주시면 되는데

    그 전에 매칭할 도메인을 먼저 생성해줍니다.

    domain 폴더에 

    Board.class를 생성해주시고 

    게시글을 작성하는데 필요한 데이터를 넣어줍니다.

    resultType으로 이 Board의 형태로 반환하여 사용할 것입니다.

    boardMapper.xml

    <mapper namespace="mapperInterface의 경로입력"></mapper>을 작성해 인터페이스와의 연결을 하고,

     

    <select id="boardCount" resultType="int">
    SELECT count(boardId) AS cnt FROM tbl_board;
    </select>

    위의 sql코드를 작성합니다. 이 명령어는 현재 데이터베이스에 있는 테이블인 

    tbl_board의 갯수를 가져와 int타입으로 반환해줍니다. 여기서 select id 이 id가 중요한데, 위에서 작성한 Mapper Interface에 있는 메소드인 boardCount()와 이름이 같습니다 위에 적어논 것과 같이 인터페이스의 메소드 명과, xml의 id명은 같도록 작성해주셔야 합니다.

     

    서비스

    boardService

    이제 서비스 단을 만들어볼 차례인데, controller와 mapper와 같이 패키지 하위에 service 폴더를 생성한 뒤, 

    BoardService 클래스를 작성합니다.

    @Service 어노테이션으로 서비스의 역할을 하는 것을 명시해주시고, 

    @RequiredArgsContructor로 Mapper 생성자를 사용할 수 있게 합니다.

     

    아래에 메소드들은 어려운 것은 없는데 BoardMapper -> BoardMapper.xml을 통해 반환된 값들을 컨트롤러로 넘겨주는 역할을 하게 됩니다.

     

     

    자 이제 service, mapper설정까지 완료했으니 제대로 쿼리가 날아가 원하는 동작을 하는지 알아보겠습니다.

     

     

     

    테스트

    게시판만들기(1)에서 작성한 BoardController인데 여기서 추가된 것은 

     

    @GetMapping("/test")의 아랫부분이죠

    BoardController

     

    이 부분은 http://localhost:8080/board/test로 접근했을 때 동작하는 부분인데요

    여기서 Model은 hashmap형태를 한 key와 value값으로 사용할 수 있는 객체인데 이를 통해

    view로 데이터를 넘겨줄 수 있게 해주는 역할을 합니다.

    model 객체의 addAttribute를 사용하는 방법은

    model.addAttribute("view에서 불러올 데이터의 값 즉 Key값", "key값을 호출했을 때 들어있는 Value")값으로 구성이 됩니다.

     

    "cnt"에는 service의 boardCount 메소드를 호출하는데, 이는 boardService->boardMapper->boardMapper.xml 단계로 

    xml에서 작성한 

    <select id="boardCount" resultType="int">
    SELECT count(boardId) AS cnt FROM tbl_board;
    </select>

    명령어를 실행해, int 타입의 tbl_board에 존재하는 데이터의 갯수를 반환한 값이 들어가게 됩니다.

    cnt == tbl_board의 데이터 수가 되고

     

    "test"에는 마찬가지로 xml파일의 getList를 실행합니다.

    <select id="getList" resultType="com.example.blog_board.domain.Board">
    SELECT
    *
    FROM tbl_board;
    </select>

    여기서 resultType은 domain폴더의 Board 클래스의 형태로 반환한다는 것입니다 .

     

    이제 실행을 해서 잘 설정이 되었는지 확인할 차례입니다.

     

    Controller에서 Model객체를 통해 담은 값들을 view에서 확인하기 위해 

    hello.html을 수정해야 하는데요

    hello.html

    [[${}]]는 타임리프 템플릿의 문법으로, model 객체에 들어있는 key를 저렇게 불러올 수 있습니다!

    cnt에는 게시글의 수, test에는 게시글 리스트가 들어있으니 test[0].title을 작성하시면 첫번째 게시글의 제목을 불러올 수 있게됩니다. 

     

    이제 스프링부트를 구동하시고 

    http://localhost:8080/board/test를 입력해서 들어가시면

    에러

    쉽게되지 않죠 이렇게,, 

    이 에러는 mapper와 연결된 Board 도메인 클래스의 생성자 문제인데 

    Board.class의 어노테이션에

    @NoArgsConstructor
    @AllArgsConstructor를 추가해주시면 에러가 해결됩니다.

     

    위 어노테이션들을 추가하고 다시 시작하시면 

    다음과 같은 페이지를 만나실 수 있습니다!

    Model 값 가져오기!

    schema.sql파일에서 테이블을 생성하고, 하나의 데이터를 넣었던 것 기억하시나요? 그 데이터의 값입니다.

    [[${cnt}]]로 게시글의 갯수인 즉 1개를 가져오고,

    [[${test[0].title}]]로 만들었던 게시글의 title인 '타이틀'을 가져와 view에 그려주는 모습을 확인할 수 있습니다.

    [[${test[0].content}]]를 작성하시면 게시글의 내용이 나오고,

    [[${test[0].boardId}]]를 작성하시면 자동으로 올라가는 게시글 번호가 나타나게 됩니다.

     

    이번 포스팅까지 마침으로서 게시판 만들기의 기본 설정이 끝이 났습니다.

    다음 포스팅부터는 본격적으로 게시판을 만들어보도록 하겠습니다. 감사합니다. 

     

     

     

    댓글

Designed by Tistory.