추가로 설계한 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 |