본문으로 바로가기

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

category Spring/API 2018. 3. 5. 15:52

1. '유저의 전체 리스트'를 가져오는 법

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

2. '원하는 유저'를 선택하기 

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

3. '새로운 유저' 생성

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



오늘은 user의 정보를 수정(Update)해보는 API를 만들어 보겠습니다.


(*잊지말 것)

(DB에서 쿼리를 짜고 → 스프링에 반영하는 방식)


DB

1. DB 훑어보기


user 테이블

→ 이 user 테이블에서 2번 유저의 login_id와 password를 수정해보겠습니다. (계정을 바꾸는건 원래 안되지만.... 연습이니 넘어갑시다.)


2. 쿼리 작성하기


UpdateUser
1
2
3
UPDATE `user`
SET login_id = 'Tora', `password` = 1234, `name` = 'King Tora'
WHERE user_id = 2

→ user_id가 2인 유저의 id, password, name을 수정하는 쿼리입니다.

    잘 돌아가는지 확인해보겠습니다.



잘 돌아갑니다.

다음으로 넘어갑시다.


Spring

1. Controller (UserApiController.java)


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

→ 컨트롤러 부분에서는 크게 언급할 것이 없습니다.

먼저, Http Method의 형태가 PUT(Update이므로)으로 바뀝니다.

@PathVariable 에서는 원하는 userId값을 받고,  @RequestBody 에서는 업데이트 하길 원하는 폼(Form)을 받기 위해 User (여기서는 유저 테이블의 정보를 업데이트 할 것이므로 User입니다. <매핑되는 모델이라고 생각하면 됩니다.>)

로 정해줍니다. update 역시 DB에서 값을 가져와서 보여주는 형태가 아니기 때문에, 리턴을 받을 필요가 없지만 성공과 실패여부를 위해 Boolean으로 합니다.


2. Service(UserService.java)


UserApiController
1
2
3
4
5
6
7
8
9
10
public boolean updateUser(Integer userId, User user) {
    if (user.getLoginId() == null) {
        throw new IllegalArgumentException("아이디를 입력해주세요");
    else if (user.getPassword() == null) {
        throw new IllegalArgumentException("비밀번호를 입력해주세요");
    else if (user.getName() == null) {
        throw new IllegalArgumentException("이름을 입력해주세요");
    }
    return userMapper.updateUser(userId, user) > 0 true false;
}

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

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

userId와 user(User) 가 잘 처리 되었으면 true, 아니면 false.

여기서 중간에 else ~ if 문이 들어갔는데, 이 부분은 원하시는 필수 입력 사항을 임의로 정해서 만든 코드 입니다.

Service단은 이처럼, 로직이 들어가는 부분이라고 생각하시면 됩니다.


3-1. Mapper(UserMapper.java)


UserApiController
1
int updateUser(@Param("userId") Integer userId, @Param("item") User user);

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

객체와 파라미터를 동시에 쓸 때는 이 어노테이션을 사용하지 않는다면 오류가 나기 때문에 @Param을 써줍니다.


3-2. Mapper(UserMapper.xml)


UserApiController
1
2
3
4
5
6
7
8
9
<update id="updateUser" parameterType="User">
    UPDATE `user`
    <set>
        <if test="item.loginId != null">login_id = #{item.loginId},</if>
        <if test="item.password != null">password = #{item.password},</if>
        <if test="item.name != null">`name` = #{item.name}</if>
    </set>
    WHERE user_id = #{userId}
</update>

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

PUT 역시 파라미터를 넘겨주는 것이니 parameterType을 작성하여 줍니다.

#{}부분은 이제 좀 익숙해졌으리라 생각하고 넘어가겠습니다. (Mapper.java에서 @Param("~")로 지정을 해준 파라미터는 반드시 ~를 써주어야 합니다. 객체는 ~.객체의 원하는 값)

새로운 Mybatis문법이 등장합니다.

<set>, <if test=...> 이 놈들인데, 어렵게 생각하실 필요가 전혀 없습니다.

<set> → 이놈은 DB의 SET의 역할입니다. 단지 set 구문 안에 여러 조건이 들어갈 때 사용해 주시면 됩니다.

<if test=...> → 이놈은 보이는 그대로 if문입니다. if test까지는 아무 생각 없이 적어주시고, item.loginId가 null이 아니면 login_id 컬럼에 불려오는 객체의 loginId(item.loginId)를 넣겠다는 뜻입니다. (즉, 객체의 파라미터를 넘겨주었다면 그 값을 넣겠다는 뜻입니다.)

password와 name부분도 다 같은 의미입니다.

반드시 </~>이렇게 해서 닫아주셔야 합니다.


4. 결과

Postman에서 보겠습니다.

→  요청 Http Method와 url입니다.

파라미터는 User 모델에서의 형태에 맞게 보내줍니다.

→ boolean으로 성공여부를 봤습니다.

→ DB를 확인해 봅니다. 잘 업데이트 되었습니다.


다음 시간에는 이제 유저를 지우는 법에 대해서 다뤄보겠습니다.