intellij project 생성 , mybatis 작동원리

김지원·2022년 6월 11일
0

WebDevelop

목록 보기
1/21

1. 프로젝트 생성

  • name : bbs-basic
  • java version : 8
  • jar로 설정 후 프로젝트를 만든다.


Spring Boot DevTools, Spring Web, Thymeleaf 체크하고 create.

2. 의존성 (dependency) 추가

pom.xml로 가서 의존성을 추가한다. 총 3개를 추가 할 것이다.

command + n => Add dependency

  • spring-boot-starter-jdbc (맨 위 2.6.7 version)
    -> 자동으로 버전적힌거 삭제한다.

  • mariadb-java-client

  • mybatis-spring-boot (2.2.2version)

의존성 3개 추가 후 동기화한다.

pom.xml에 추가 된 것을 볼 수 있다.


src -> resources -> application.properties 에 가서 정보를 입력해준다.

자동완성 사용.

1.mappers/.xml :
2.mappser/
/.xml
3.mapper/**/
.xml : *과 유사하다. 0개가 오든 무한개가 오든 상관이 없다는 의미
mappers/a.xml : .xml로 끝나면 된다. 디렉터리만 존재. 중간의 폴더에 대한 설명이 없다. 1번에만 적용됨.
mappers/a/b.xml : 2번에만 적용됨. a디렉터리있고 b.xml이 있어야한다.
mappers/a/b/c.xml :
mapper/a/b/d.txt : 모든경우 부합하지 않는다.

해당 파일 경로로 추가를 해준다.


추가 경로의 느낌이 난다.


resources 디렉터리 추가!

만든 폴더명과 (Mappers) 와
mybatis.mapper-locations=classpath:mappers/*/.xml 경로의 이름이 동일해야한다.

우리는 dao 만들지 않기에 뒤에 xml을 꼭 적어줘야한다.

xml파일이 쿼리를 다 담고 있을 것이다. dao를 만들지 않기 때문에.
만들어도 인터페이스를 만드는데 인터페이스는 구현부를 가지지 않아서 쿼리를 xml파일에 적어야한다. xml파일은 resources -> mappers파일안에 닫을 것이다 .



Setting 창 => command + ','
=> Compiler -> Build project automatically 체크여부확인.


오른쪽 위에서 Edit Configurations 체크


Project Structure => command + ; Facets


package에 동그란 구멍이 생긴다.
project 준비 setting 완료. 이 중에서 하나라도 누락되서는 안되며 꼭 알고있어야 한다.


mybatis가 어떻게 작동되는지 알아보자.
SELECT1을 Root에 찍어보록 하자.

controllers 패키지에 RootController 클래스 추가. dao 대신 mappers추가.


컨트롤러임을 지정해주고 맵핑해준다.

@Controller : 이 클래스가 controller임을 알려주는 어노테이션 추가.
@RequestMapping : "/" 자기페이지 url.

services 패키지에서 TestService 클래스 만들어주고 service 또한 어노테이션을 붙여준다.

@Responsbody : 반환하는 문자열 값이 thymelef template이 아니라 반환하는 문자열 그대로가 응답 값이 되어야 한다.  

컨트롤러로 넘어와서
RootController의 멤버 상수인 TestService를 만들어준다.


private작성 후 빨간줄뜨면 눌러서 생성자 만든다.
command+n - add constructor => 생성자 추가
TestService를 RootController 생성자에 포함시켜서 멤버변수가 생성자의 매개변수로 들어와있게 된다.

그 생성자 메서드에 이 생성자를 가진 매개변수는 Spring이 알아서 객체화를 해야된다 라는 의미인 어노테이션 @Autowired 붙인다.
TestService를 스프링이 알아서 객체화해준다.

조건 => 스프링이 인식가능해야한다 : @Autowired @Service 두 개의 어노테이션이 붙어있어야한다. 아닐 시에 오류가 터진다.

이런걸 의존성주입이라고 한다.
RootController는 아무나 객체화 못하고 TestService에 의존적이다.


TestService로 넘어와서 int 값을 반환하는 getTestValue를 만든다.
물론 getTestValue가 retrun1을 하게 되면 결과는 같겠지만 mybatis를 배우는 개념이 아니기 때문에 넘어가자.



Mappers 패키지에 ITestMapper을 인터페이스로 추가한다.


Mapper에는 @Mapper어노테이션이 붙는다.
ITestMapper에 int타입을 반환하는 selectTestValue추가. public을 적을 필요 없다.
인터페이스를 가지는 모든 메서드는 public이여만 하기 때문이다.

service에 testMapper주입. Autowired를 했기때문에 testMapper매개변수에 빨간색 밑줄이 그이지 않는다. 즉 Spring이 이 Mapper을 인식하고 있다는 걸 의미한다.


this.testMapper.selectTestValue(); 추가.


RootController로 넘어가서
return value; 하면 빨간줄이 그인다.
return String.valueOf(value); 로 해야한다.
Stringformat을 해도 무관하다.

여기서 우리는 value값이 1이 돌아오기를 바란다. 그런데 어디에서도 SELECT1을 해야된다는 소리가 없다. 그래서 우리가 SELECT1이라는 쿼리를 xml파일에 집어넣어야 된다는 의미이다.


mappers 에 TestMapper.xml이라는 파일을 만들어 준다.

그러고 나서 이 파일이 xml파일이며 mybatis의 내용을 담을 것이라는 걸 알려줘야하다. 그에 대한 내용을 적어보자.

파일에서 '<' 후 자동완성. => xml파일이라는 걸 알려주는 것 일뿐이다. UTF-8추가해준다.

원래 html파일에서 thymeleaf문법을 사용하지 못한다. 그런데 쓸 수 있는 이유가 xmlns:th="http://www.thymeleaf.org"을 써서 쓸 수 있는 것이다. 이러한 느낌이랑 비슷하다.


!DOCTYPE~ 추가.
mapper파일의
namespace : 속성값을 준다.
현재 testMapper랑 ITestMapper는 관계가 없다. 관계를 맺게 해주는 방법이..
Mapperxml파일의 namespace 속성값을 이 인터페이스의 풀네임으로 적어주면 된다.

mapper namespace="dev.jwkim.bbsbasic.mappers.ITestMapper"

추가해주고 option + click 했을 때 열려야 잘 적은것이다.

여기까지 적은게 mappe.xml파일의 기본 포맷이라고 볼 수 있다.

이걸 메모장에 적어놓고 매번 갖다쓰면 되게 없어보인다.
그래서 이것을 템플릿에 저장을 하자.


전체 복사하자.

command + ,


File and Code Templates -> + 누르고 Name을 설정해주고 -> Extension에는 xml을 적어주고 복사한걸 붙어넣는다. -> 왼쪽에 Mybatis.XML 생긴걸 확인하고 ok!


사진의 mappers가 아닌 resources 패키지의 mappers에 오른쪽 마우스를 누르면 Mybatis.XML이 있는 걸 확인 할 수 있다. 열게되면 우리가 설정해 놓은 포맷들이 자동으로 설정되어 있는 걸 볼 수 있다.

=> 왜 이런짓을 하냐?
xml의 파일이 dao의 갯수만큼 늘어나기 때문이다. 1:1 매칭이다.
Mapper인터페이스 dao 랑 1:1, Mapper인터페이스 xml 도 1:1이다.
xml파일도 필연적으로 dao갯수만큼 늘어난다.


실제로 실행할 쿼리선택를 선택한다. SELECT!

여기서 의미하는 id 는 위에 namespace에 적어놓은 인터페이스 메서드의 이름을 id로 적으면 된다.

=> 의미하는 것 : ITestMapper에 selectTestValue 메서드를 실행하면 이 쿼리문을 실행하겠다는 의미이다.

이 xml파일과 인터페이스의 연결 관계를 성립해주는 것 자체는 namespace에 적어놓은 인터페이스의 풀네임이 되는 거고
그러고 나서 각 SELECT, DELETE, UPDATE, INSERT 가 된 후에 1을 주게 되면 이게 메서드랑 연결이 된다.

=> SELECT1 적어준다.


그 전에 데이터베이스 추가하자!

testConnection 필수

=> SELECT1 적어준다.

selectTestValue는 반환 값, 타입이 있다. 그 타입은 resultType 으로 설정해준다. 이거는 자바타입과는 다르다. int타입을 반환하게 되면 Integer가 반화된다. 오류는 뜨지 않는다.
조금 더 보다 명시적으로 반환했으면 좋겠다고 하면 _int 로 작성해야한다.


실행해보자

localhost:8080 에 들어가면 이렇게 뜨면 된다. 1은 자바아니고 DB가 돌려주는 값이다.

최종 정리

namespace : 인터페이스의 풀네임
요소들(insert,delete....)의 id 속성 값 : 메서드의 이름


지금까지의 파일 경로.


ITestMapper에 추가.
@Select 어노테이션 사용.


서비스에서 selectTestValueDirect 메서드를 호출해보자.

저렇게 select, update... 어노테이션을 달게되면 xml 파일 조차 명시를 해주지 않아도 된다.

Controller, service 에 단 하나 있는 메서드를 호출해서 값을 물려받고 서비스에 있는 getTestValue 메서드는 getter에 있는 메서드를 호출해서 값을 바로 돌려준다.
이 구조가 이해안되면 큰일...

test완료.

0개의 댓글