예제를 만들자 뚱땅뚱땅

API 만들기 연습 #9

NEWDODORIPYO 2022. 9. 2. 09:08

추가로 설계한 Device 등록 로직 만들기

VO , DTO 먼저 만들어주자

DeviceVO

package com.apiservice.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class DeviceVO {

    private Integer serviceNumber; // 서비스 번호
    private String deviceName;  // 장치 이름
    private String deviceType;  // 장치 종류
    private String installer;   // 설치 기사
    private String region; // 지역

    private LocalDateTime inDate; // 설치 날짜

    private Integer memberNumber; // 고객 번호

}

DeviceDTO

package com.apiservice.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class DeviceDTO {

    private Integer serviceNumber; // 서비스 번호
    private String deviceName;  // 장치 이름
    private String deviceType;  // 장치 종류
    private String installer;   // 설치 기사
    private String region; // 지역

    private LocalDateTime inDate; // 설치 날짜

    private Integer memberNumber; // 고객 번호

}

고민해볼 것

Device 즉 장치를 등록할 때 사용자 테이블에는 어떻게 추가시켜야 하지?

등록할 때도 사용자 테이블의 PK를 가져와야 하는데 어떻게 하지?

한 개의 쿼리로 처리를 할 수 있을까? insert 문에서 join을 해서 가능한가…? 를 고민하고 구글링 해보다가 아… 쿼리를 두 번 날려야 하나…? 하는 생각이 들었다

insert를 하고 update를 통해 사용자 테이블에 값을 증가시켜야겠다 이게 좋은 방법인지는 모르겠지만 우선 생각나는 게 이 방법이니 반정 규화? 의 느낌으로 진행해보겠습니다

우선 DeviceRepository 만들어주기

package com.apiservice.repository;

import com.apiservice.model.DeviceVO;
import org.springframework.stereotype.Repository;

@Repository
public interface DeviceRepository {

    void deviceInsert(DeviceVO deviceVO);
}

DeviceRepository. xml 만들기


http://mybatis.org/dtd/mybatis-3-mapper.dtd>">



    
        insert into api.device( device_name, device_type, installer, in_date, region, member_number)
        value(#{deviceName},#{deviceType},#{installer},now(),#{region},#{memberNumber})
    


update를 해주기 위해 ApiRepository에 코드 추가

package com.apiservice.repository;

import com.apiservice.model.ApiDTO;
import com.apiservice.model.ApiVO;
import com.apiservice.model.DeviceDTO;
import com.apiservice.model.ListDTO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface ApiRepository {

    void insert(ApiDTO apiDTO);

    void update(ApiDTO apiDTO);

    void delete(Integer memberNumber);

    List<ApiVO>selectList(ListDTO listDTO);

    int getTotal(ListDTO listDTO);

    ApiVO getPk(ApiDTO apiDTO); // api 테이블 pk

    ApiVO getId(ApiDTO apiDTO); // api 테이블 memberId

    void updateDevicesCount(@Param("memberNumber") Integer memberNumber, @Param("amount") int amount);
    
}

ApiRepository. xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.apiservice.repository.ApiRepository">

    <sql id="search">
        <where>
            <if test="keyword != null">
                <foreach collection="types" item="item" separator="OR" open="(" close=")">
                    <if test = 'item == "i"'>
                        member_id like concat('%',#{keyword} , '%')
                    </if>
                    <if test='item =="n"'>
                        member_name like concat('%' , #{keyword} , '%')
                    </if>
                    <if test='item =="p"'>
                        member_phone like concat('%' , #{keyword} , '%')
                    </if>
                    <if test='item =="a"'>
                        advert like concat('%' , #{keyword} , '%')
                    </if>
                </foreach>
            </if>
        </where>

    </sql>

    <insert id="insert">
        insert into api.api(member_id , member_pw , member_name , member_phone , advert)
        values (#{memberId} , #{memberPw} , #{memberName} , #{memberPhone} , #{advert})
    </insert>


    <update id="update">
        update api.api
        set update_date  = now()
          <if test=" memberId != null and memberId != '' ">
          , member_id    = #{memberId}
          </if>
          <if test="memberPw != null and memberPw != '' ">
          , member_pw    = #{memberPw}
          </if>
          <if test="memberName != null and memberName != '' ">
          , member_name  = #{memberName}
          </if>
          <if test="memberPhone != null and memberPhone != '' ">
          , member_phone = #{memberPhone}
          </if>
          <if test="advert != null and advert != '' ">
          , advert       = #{advert}
          </if>
        where member_number = #{memberNumber}
    </update>

    <delete id="delete">
        delete
        from api.api
        where member_number = #{memberNumber}
    </delete>

    <select id="selectList" resultType="com.apiservice.model.ApiVO">
        select member_number ,member_id , member_pw , member_name , member_phone , advert , update_date
        from api.api
        <include refid="search"></include>
        order by member_number desc
        limit #{skip},#{size}
    </select>

    <select id="getTotal" resultType="int">
        select count (member_number) from api.api
        <include refid="search"></include>
    </select>

    <select id="getPk" resultType="com.apiservice.model.ApiVO">
        select member_number from api.api
        where member_number = #{memberNumber}
    </select>

    <select id="getId" resultType="com.apiservice.model.ApiVO">
        select member_id  from api.api
        where member_id = #{memberId}
    </select>

    <update id="updateDevicesCount">
        update api.api set deviceCount = deviceCount + #{amount} where member_number = #{memberNumber}
    </update>


</mapper>
  • updateDevicesCount를 보면 Param으로 받는 amount 값으로 Count 에 값을 추가해주고 Param 으로 들어오는 member_number을 여기서 매칭 해준다

DeviceService

package com.apiservice.service;

import com.apiservice.model.DeviceDTO;
import org.springframework.transaction.annotation.Transactional;

@Transactional
public interface DeviceService {

    void register(DeviceDTO deviceDTO);
}

DeviceServiceImpl

package com.apiservice.service;

import com.apiservice.model.DeviceDTO;
import com.apiservice.model.DeviceVO;
import com.apiservice.repository.ApiRepository;
import com.apiservice.repository.DeviceRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Service;

@Service
@Log4j2
@RequiredArgsConstructor
public class DeviceServiceImpl implements DeviceService{

    private final ApiRepository apiRepository;
    private final DeviceRepository deviceRepository;
    private final ModelMapper modelMapper;

    @Override
    public void register(DeviceDTO deviceDTO) {

        DeviceVO deviceVO = modelMapper.map(deviceDTO, DeviceVO.class);

        deviceRepository.deviceInsert(deviceVO);

        apiRepository.updateDevicesCount(deviceDTO.getMemberNumber(),1);
    }
}

장치를 추가하는 register 할 때 inster 한번 api테이블에 update 한번 총 2번의 쿼리가 실행된다

이제 Controller을 만들어서 테스트를 한번 해보자

DeviceController

package com.apiservice.controller;

import com.apiservice.model.DeviceDTO;
import com.apiservice.service.DeviceService;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/device/")
@Log4j2
@RequiredArgsConstructor
public class DeviceController {

    private final DeviceService deviceService;

    @ApiOperation("Device Post register")
    @PostMapping("/register")
    public ResponseEntity registerPost(DeviceDTO deviceDTO){
        log.info(deviceDTO);
        log.info("controller register");

        deviceService.register(deviceDTO);

        return new ResponseEntity(HttpStatus.OK);
    }
}

swagger-ui로 테스트

DB 확인해보기

device 테이블 <장치>

api 테이블 <회원>

잘 들어온다

 

기본적인 insert 로직은 끝났다

insert 하나에도 많은 고민이 있었다 전에 만들었던 코드들에서 힌트를 얻기도 하고 여기저기 구글링 하면서 찾아보기도 하면서 지금의 코드가 나왔다 기본적인 틀을 좀 더 만들고 전처럼 리펙토링 하는 식으로 진행해 보겠습니다

'예제를 만들자 뚱땅뚱땅' 카테고리의 다른 글

API 만들기 연습 #11  (1) 2022.09.06
API 만들기 연습 #10  (0) 2022.09.05
API 만들기 연습 #8 추가 설계  (0) 2022.09.01
API 만들기 연습 #7 검색  (0) 2022.08.31
API 만들기 연습 #6 유효성 검증  (0) 2022.08.30