본문으로 바로가기

Spring + MyBatis로 API 생성해보기(3)

category Spring/API 2018. 1. 23. 10:53

저번 시간에는 '유저의 전체 리스트'를 가져오는 법(1)(Spring + MyBatis 로 API 생성해보기)과 '원하는 유저를 선택하기(2)(Spring + MyBatis로 API 만들어 보기(2))를 해보았습니다.

이제 원하는 것들을 가져올 수 있으니, 새로 생성도 해볼 수 있어야 겠죠?

이번 시간에는 새로운 유저 생성을 해보겠습니다.


예) 새로운 user를 생성해주세요!


이쯤되면, 어디서부터 볼 지 감이 잡히시죠?


바로, DB입니다. 


생각을 하고 코드를 짜야해요. 아무 생각없이 두드리면 이상한 짓(질문) 하게 됩니다.


DB

1. DB 훑어보기


자 user 테이블 한 번 봐주시고....

새로운 user를 생성할 건데, 보통의 회원가입할 때를 생각해봅시다.


당연히 아이디 넣어야 되고, 비밀번호 넣고, 닉네임도 넣고!

(맨 앞의 user_id는 테이블 생성할 때, PRIMARY KEY옵션과 AUTO_INCREMENT 옵션을 줬습니다. login_id도 PRIMARY KEY 옵션 주었습니다. 아이디가 중복되면 안되겠죠?)


보통은 더 복잡하지만 저희는 연습용이니 일단 이 정도만 해보겠습니다.


2. 쿼리 작성하기


쿼리를 작성해 보겠습니다. 

저번 시간에도 말했듯이 DB에서 다 처리할 수 있으면 처리하고 logic을 짜는게 좋다고 했습니다.

쿼리로 먼저 다 처리할 수 있을 만큼 처리하고 스프링으로 넘어갑시다.


insertUser
INSERT INTO `user` (login_id, `password`, `name`)
VALUES('Test''test1''testttttttttt')

INSERT INTO 테이블 (컬럼명)

VALUES (값)

→ user_id를 제외한 나머지 값을 채워서 넣습니다.

잘 들어갑니다.


Spring

1. Controller (UserApiController.java)


UserApiController
1
2
3
4
5
@RequestMapping(value = "/users", method = RequestMethod.POST)
public @ResponseBody
Boolean insertUser(@RequestBody User user) {
    return userService.insertUser(user);
}

→ 컨트롤러의 형태는 저번과 크게 다르지 않습니다.

다만, Http Method의 형태가 POST형태로 바뀌었습니다. (폼 입력 처리방식이라고... 그냥 DB에 값 넣을 때는 POST! 아, 그렇구나 하고 넘어갑시다.)

그리고 새로 보이는 놈이 @RequestBody 이놈인데 Http 요청몸체를 자바 객체로 변환.... 뭔가 요청할 때 쓰입니다.

간단하게 말하자면, 우리는 User모델의 형태로 (login_id, password, name이죠?) 새 user를 생성할 것이고, 이 형태로 DB에 넣어야만 하니

@RequestBody User user →를 해석하자면 User의 `몸` 형태로 요청한다고 생각하시면 됩니다.

메소드의 파라미터 부분이니 파라미터로 User 형태로 받는다고 생각합니다.


근데 메소드 선언을 왜 Boolean 형태로 했을까요?

이건 POST형식 즉, insert는 DB에서 값을 가져오는 형태가 아니라, DB로 값을 보내는 형식이므로 리턴을 받을 것이 없습니다.

그래서 void.....로 하나 여기서는 성공, 실패여부를 보기 위해 Boolean으로 했습니다.


2. Service(UserService.java)


UserService
1
2
3
public boolean insertUser(User user) {
    return userMapper.insertUser(user) > 0 true false;
}


→ boolean은 위에서 설명했고, 요청 파라미터는 User user

return 은 3항 연산자로 insertUser의 성공여부를 판단하기 위한 것입니다.

무엇인가 잘 들어갔으면(0보다 크면) true, 아니면 false를 보냅니다.


3-1. Mapper(UserMapper.java)


UserMapper
1
int insertUser(@Param("item") User user);


→ Service에서 0 > ? 를 판별해야 하므로 int를 줍니다.

새로운 놈이 보이는데, @Param("item") 무엇일까요?

나중에 자세히 정리해드리겠지만, 간단히 짚고 넘어가자면 @Param 어노테이션을 붙이면

원하는 이름으로 매퍼에서 사용할 수 있습니다.

위와 같이 객체를 넘기게 되면 item.userId 와 같이 사용이 되며, 그냥 단순 파라미터일 경우 @Param("이름") 에 이름으로 사용해주시면 되겠습니다.

사용하는 이유는 일단 구분짓기 편하기 때문... 이라고 그렇구나 하고 넘어갑시다.

(*객체와 파라미터를 동시에 쓸 때는 이 어노테이션을 사용하지 않는다면 오류가 납니다.)


3-2. Mapper(UserMapper.xml)


UserMapper.xml
1
2
3
4
<insert id="insertUser" parameterType="User">
    INSERT INTO `user` (login_id, password, `name`)
    VALUES(#{item.loginId}, #{item.password}, #{item.name})
</insert>


→ id는 역시 Mapper.java파일에서 메소드명하고 일치해야 합니다.

POST 즉, insert는 결과를 받는 것이 아니라, 파라미터를 넘겨줘야하니 resultMap이 아닌 parameterType을 써줍니다.

parameterType 역시 User의 형태로 새로 생성을 할 것이니 User.

 쿼리는 처음에 DB에서 테스트 했던 그 쿼리에 저번 시간에 얘기했던 MyBatis 문법인 #{} 이 형태를 써서 파라미터를 받습니다.

저번 시간에 말을 안하고 넘어갔는데, #{} 여기에 들어가는 파라미터들은 모델에서 넘어오는 파라미터 부분과 매핑해주어서 작성해야 합니다.


4. 결과

Postman에서 보겠습니다.

→ 요청 Http Method와 url입니다.

→ 파라미터는 이렇게! User의 형태에 맞게 보냅니다.

→ boolean으로 성공여부를 보았습니다. 성공이군요.

→ DB를 확인해볼까요? 잘 들어왔네요.


(*주의! 테이블에 loginId를 pk설정을 해놓았으므로, 아이디가 중복되면 duplicate에러가 납니다.)


다음시간에는 유저의 정보를 수정하는(Update) Http Method인 PUT을 한 번 해보겠습니다.