본문으로 바로가기

Spring + MyBatis로 API 만들어 보기(1)

category Spring/API 2018. 1. 18. 18:51
  • 전체적인 흐름
    요청(url, Http Method) → Controller → Service → Mapper → 쿼리 실행 (mapper.xml)

- > 일단 아 이렇구나...라고만 이해하고 넘어가자.

example) user테이블에서 유저리스트를 가져오는 api를 만들어주세요!


1. DB 설계

1) user table 생성

CREATE TABLE `user` (                                                                            → user 앞과 뒤에 붙인 ``는 기존에 DB 예약어와 겹칠 때 사용한다.
user_id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
login_id VARCHAR(32) NOT NULL,
password VARCHAR(128) NOT NULL,
name VARCHAR(32) NOT NULL
)

→ 각 컬럼도 잘 생각해서 만들자.



2. 쿼리 작성

1) 유저리스트를 가져와야해 ..


SELECT *
FROM `user`

→ SELECT절에 *는 되도록이면 피하자. 성능저하가 된다. 따라서, 다음과 같이 사용한다.


SELECT user_id, login_id, password, name
FROM `user`


3. Model 작성 (User.java)

1) Model은 애플리케이션의 정보(데이터)를 나타낸다..!

    따라서, user의 정보에 대해 나타내야해.


(왜 마크다운 지원 안해...ㅠㅠ)



→ 변수들을 필요의 용도에 맞게 선언을 해주고 (DB의 컬럼에 맞게 이름도 잘 지어주자.)

    Getter와 Setter를 만들어준다.


여기서 잠깐!)  Getter Setter?

간단하게 캡슐화 + 유지보수의 개념으로 사용한다.

메소드를 사용함으로써, 데이터 변경을 용이하게 한다.

여기 내용 보충해주세요!


4. Controller 작성 (UserApiController.java)

1) User에 관련된 Controller들을 작성할거니 이름을.... UserApiController로 지어야겠어!!

Controller의 역할은 데이터(Model)와 비즈니스 로직 사이(Service)의 상호동작을 관리한다.

여기서는 요청이 들어오는 URL과 Http Method에 대해서 정의를 한다. 

따라서, return의 형태를 잘 생각해서 작성을 해야 한다.

→ 내가 받고자 하는 데이터의 형태는....

  • user의 목록! (List)


그러면, 다음과 같이 작성 되시겠다.

@Controller // Controller라고 명시
@RequestMapping(value = "/api") // 기본 url
public class UserApiController {

@Autowired
private UserService userService; // @Autowired 어노테이션은 의존하는 객체를 자동으로 삽입하는 역할을 한다.

}

@RequestMapping은 Spring Framework의 annotation으로, 연결할 url과 Http Method의 형태를 정의해준다.

@ResponseBody annotation은 메소드에서 리턴되는 값이 View에 보여지는게 아니라 Http Response Body에 직접 쓰여지게 된다.

리턴되는 형태는 List이니 List<User>로 메소드를 선언한다. ex) List<Class> → 모델에서 정의한 형태로 받을거야.

여기서 return 부분에는 Service에서 값(데이터)을 받아오게 되어 있다.

그렇다면 Service는 뭐하는 놈이냐!!!!


5. Service 작성 (UserService.java)

1) Service에 로직을 담고... 데이터를 처리(가공)해야 하지... 일단 이름은 UserService야!

Service는 넘어온 데이터를 가공하고, Controller로 보내주는 역할을 한다.

지금은 UserList를 받아서 보내주기만 하면 되니... 다음과 같이 되시겠다.


Service는 Transaction단위로 처리가 된다. 위에 @Service와 @Transactional 어노테이션을 반드시 명시해주자.

(여긴 나중에 부가 설명 추가하자. Transaction?)

여기서 return으로 userMapper에서 값(데이터)을 받아오게 되어 있다.

또 어디를 가는거냐... Mapper로 가보자.


6-1. Mapper 작성 (UserMapper.java - Interface)

1) MyBatis로 오셨다. 여기는 쿼리문과 매핑을 시켜서 데이터를 받아오지... Mapper는 인터페이스이다(인터페이스는 나중에 정리)

Service에서 유저의 리스트를 내놓으라고 했으므로... 여기에도 이름 잘 선택해서 다음과 같이 작성해주자.

에게?... 짧다... 아무튼, @Repository 어노테이션 까먹지말고..

→ @Repository 어노테이션은 어떤 클래스가 그 역할을 충족시켰거나 레파지토리의 stereotype (또는 데이터 접근계층이나 DAO로 알려진)이라는 표시이다.  (뭔 소리야.. 나중에 또 정리하자!!!!!!!!!!!!!!!!!!!!!!)

여기서의 메소드 이름은 다음에 우리가 작성하게 될 곳에서 매핑(매칭된다고 생각하자.) 할 것이므로 잘 기억하자.


6-2. Mapper.xml 작성

1) xml이라니!! 여기엔 SQL 쿼리문을 써주면 된다. 조금 복잡할 수도 있으니 눈 크게 뜨고 잘 보자.

뭐야.. 잘 안보여..

3문단(?..)으로 되어 있으니 3개로 쪼개서 한 번 보자.


  1. Mapper 인터페이스와 매핑해주는 곳. (설정?)

→ 다른건 다 필요없고 마지막에 namespace부분을 잘 보자. "kr.~~~~.UserMapper"라고 되어 있다. 앞에 kr~어쩌구 부분은 패키지(경로라고 생각하자. 마음이 편해진다.)

쭈~욱 타서 6-1에서 작성한 UserMapper.java(인터페이스)를 지칭한다. 여기랑 매핑시켜준다는 의미이다.


      2. User Model과 매핑해주는 곳. (설정2?)


→ id부분은 쿼리문에서 요 부분과 매핑을 하겠어요! 하고 맞추는 부분이다. 입맛대로 이름 설정....하지 말고 잘 생각해서 해라.

type 부분은 User.java(모델) 부분... 즉! 우리가 최종적으로 보여줄 형태..(Json)가 있는 곳과 매핑하는 곳이다.

result column은 테이블의 칼럼과 맞춰주고, property는 type에서 설정한 모델쪽의 변수들과 맞춰주자.


      3. 대망의 쿼리문

여기까지 오느라 고생 많았다... ㅠㅠㅠㅠㅠ

여기는 실제 동작할 SQL쿼리문이 동작하는 곳이다.

(*쓰면 안되는데..)

→ id부분은 UserMapper.java(인터페이스) 부분에서 선언한 메소드와 이름을 반드시!! 맞춰주어야 한다. (매핑매핑. 그래야 고놈이 가져가겠지?...)

resultMap은 2번에서 모델과 매핑한 곳의 id를 작성해준다. (UserMap에서 매핑한 모델의 형태로 돌려주겠다는 뜻.)


7. 결과 확인

Postman에서 결과를 확인해보자!!! 갸아앍 (그냥 Chrome같은거 켜서 url 쳐도 된다...)

(Postman 사용법은 다음에...)


?.... 안보여.. 또 쪼갠다.

  1. Http Request 보내는 곳

→ Http Method는 GET이고, url은 컨트롤러에서 @RequesMapping부분의 value부분에 설정해준대로!


  2. 결과형태 (json)


→ User 모델에서 변수 명을 지정한 대로 userId, loginId, password, name으로 나온다. (DB 컬럼대로 안나온다. 헷갈리지 말자. User 모델의 변수들과 mapper.xml의 property! 매핑매핑!)

결과의 형태가 List로 나온다. Controller에서 처음에 return형태로 명시해줬다. ( json의 [ ~~ ] → 여기가 list를 뜻한다.)


고생 많았습니다! api가 완성되었습니다!!! (물론.. 각종 설정들은 빼먹었지만...)

다음에  api 만들기 이어서 포스팅 하겠다...

'Spring > API' 카테고리의 다른 글

Spring + MyBatis로 API 생성해보기(4)  (0) 2018.03.05
Spring + MyBatis로 API 생성해보기(3)  (0) 2018.01.23
Spring + MyBatis로 API 만들어 보기(2)  (0) 2018.01.19