IT/development

[spring] @RequestBody String type ๋ฐ›๊ธฐ

์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž 2023. 1. 24.

๋ชฉ์ฐจ

    spring์—์„œ @RequestBody๋กœ String type์˜ ๋ณ€์ˆ˜ ๋ฐ›๊ธฐ

    ์Šคํ”„๋ง RestFul๋ฐฉ์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ๋ฐ›์„ ๋•Œ ๋‹นํ™ฉํ–ˆ๋˜ ๊ฒฝํ—˜์ด ์žˆ์–ด ์ด๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
    ๋ณดํ†ต ์Šคํ”„๋ง์—์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ Dto๋‚˜ Vo๋“ฑ์˜ ๊ฐ์ฒด ํƒ€์ž…์œผ๋กœ ๋ฐ”์ธ๋”ฉ ์‹œ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ์ฒด๋กœ ์ „๋‹ฌ ๋ฐ›๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.

    package study.lsyrestapitest1.controller.api;
    
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import study.lsyrestapitest1.domain.dto.UserDto;
    import study.lsyrestapitest1.service.UserService;
    
    @RestController
    @Slf4j
    @RequiredArgsConstructor
    @RequestMapping(value = "/v1/users")
    public class UserApiController {
    
        private final UserService userService;
    
        @GetMapping(value = "")
        public Object findList(@RequestBody UserDto userDto) throws Exception {
            return null;// ์ด๊ฑด ์ผ๋‹จ ๋ฌด์‹œํ•˜์ž
        }
    }

    ํ•˜์ง€๋งŒ ๋งŒ์ผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „๋‹ฌ ๋ฐ›๋Š” parameter๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๋กœ ๋ฐ›๊ธฐ ์• ๋งคํ•œ ๊ฒฝ์šฐ๋Š”?
    ์˜ˆ๋ฅผ ๋“ค์–ด user_name๋“ฑ 1๊ฐœ๋งŒ ์ „๋‹ฌ ๋ฐ›๋Š” ๊ฒฝ์šฐ, ๋ญ”๊ฐ€ ๋ฐ์ดํ„ฐ 1๊ฐœ๋งŒ ๋ฐ›๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ์ข€ ์• ๋งคํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ๋‹น์—ฐํžˆ ์•„๋ž˜์ฒ˜๋Ÿผ @RequestBody๋ฅผ ์„ ์–ธํ•œ ๋‹ค์Œ Stringํƒ€์ž…์œผ๋กœ userName์„ ๋ฐ›์•˜๋‹ค.
    ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์•„๋ž˜์ฒ˜๋Ÿผ ์ฝ”๋“œ๋“ค์„ ์ž‘์„ฑํ–ˆ๋‹ค.

    ํ…Œ์ด๋ธ”

    --table create
    CREATE TABLE `temp_user` (
      `user_seq` int(20) NOT NULL AUTO_INCREMENT,
      `user_name` varchar(30) NOT NULL COMMENT '์‚ฌ์šฉ์ž๋ช…',
      `user_email` varchar(30) NOT NULL COMMENT '์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ',
      `reg_date` timestamp NULL DEFAULT NULL COMMENT '๋Œ€์ถœ์ผ',
      PRIMARY KEY (`user_seq`,`user_email`)
    ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    
    --------------------------------------------------------------------------------------
    
    --test data insert
    INSERT INTO reno.temp_user
    (user_seq, user_name, user_email, reg_date)
    VALUES(1, 'ํ† ๋ฅด', 'thor@naver.com', '2022-12-21 22:57:07.000');
    INSERT INTO reno.temp_user
    (user_seq, user_name, user_email, reg_date)
    VALUES(2, 'ํ—ํฌ', 'hulk@naver.com', '2022-12-21 22:57:07.000');
    INSERT INTO reno.temp_user
    (user_seq, user_name, user_email, reg_date)
    VALUES(3, 'ํƒ€๋…ธ์Šค', 'tanos@naver.com', '2022-12-21 22:57:07.000');
    INSERT INTO reno.temp_user
    (user_seq, user_name, user_email, reg_date)
    VALUES(4, 'ํƒ€๋…ธ์Šค', 'ta@naver.com', '2023-01-03 18:17:00.000');
    INSERT INTO reno.temp_user
    (user_seq, user_name, user_email, reg_date)
    VALUES(5, '๋ฃจ๊ฐˆ', 'lo@naver.com', '2023-01-03 18:22:49.000');
    INSERT INTO reno.temp_user
    (user_seq, user_name, user_email, reg_date)
    VALUES(6, '๋ฆฌ๋ณธ', 'libon@naver.com', '2023-01-03 18:25:31.000');
    INSERT INTO reno.temp_user
    (user_seq, user_name, user_email, reg_date)
    VALUES(7, '', 'libon@naver.com', '2023-01-03 18:26:02.000');
    INSERT INTO reno.temp_user
    (user_seq, user_name, user_email, reg_date)
    VALUES(8, '๋กœํ‚ค', 'libon@naver.com', '2023-01-03 18:28:13.000');
    INSERT INTO reno.temp_user
    (user_seq, user_name, user_email, reg_date)
    VALUES(9, 'ํ…Œ๋ž€', 'terran@naver.com', '2023-01-03 21:55:14.000');

    dto

    package study.lsyrestapitest1.domain.dto;
    
    import lombok.Getter;
    import lombok.NoArgsConstructor;
    import lombok.Setter;
    import lombok.ToString;
    
    @Getter @Setter
    @ToString
    @NoArgsConstructor
    public class UserDto {
    
        private int user_seq;
        private String user_name;
        private String user_email;
        private String reg_date;
    }

    controller

    package study.lsyrestapitest1.controller.api;
    
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import study.lsyrestapitest1.service.UserService;
    
    @RestController
    @Slf4j
    @RequiredArgsConstructor
    @RequestMapping(value = "/v1/users")
    public class UserApiController {
    
        private final UserService userService;
    
        @GetMapping(value = "")
        public Object findList(@RequestBody String userName) throws Exception {
            return userService.findMembers(userName);
        }
    }

    service

    package study.lsyrestapitest1.service;
    
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    import study.lsyrestapitest1.domain.dto.UserDto;
    import study.lsyrestapitest1.mapper.UserMapper;
    
    import java.util.List;
    
    @Service
    @Slf4j
    @RequiredArgsConstructor
    @Transactional(readOnly = true)
    public class UserService {
    
        private final UserMapper userMapper;
    
        public List<UserDto> findMembers(String userName) throws Exception{
            return userMapper.findMembers(userName);
        }
    
    }

    mapper(interface)

    package study.lsyrestapitest1.mapper;
    
    import org.apache.ibatis.annotations.Mapper;
    import org.springframework.stereotype.Repository;
    import study.lsyrestapitest1.domain.dto.UserDto;
    
    import java.util.List;
    
    @Mapper @Repository
    public interface UserMapper {
    
        List<UserDto> findMembers(String userName);
    
    }

    mapper(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="study.lsyrestapitest1.mapper.UserMapper">
    
        <select id="findMembers" parameterType="String" resultType="study.lsyrestapitest1.domain.dto.UserDto">
            SELECT    user_seq
                    , user_name
                    , user_email
                    , reg_date
            FROM temp_user
            <where>
                <if test="userName != null and userName != ''" >user_name = #{userName}</if>
            </where>
        </select>
                                                                                    
    
    
    </mapper>

    ์œ„์—์„œ ์‚ฌ์šฉ๋œ <where></where>๋Š” ์•„๋ž˜๋ฅผ ์ฐธ์กฐ

    [mybatis] mybatis ๋™์ ์ฟผ๋ฆฌ(feat. <where></where>)

    ๋ชฉ์ฐจ mybatis Dynamic SQL ๐Ÿ˜ƒ ๊ณ„์† ์‹ค์ˆ˜ ํ–ˆ๋˜ ๋™์ ์ฟผ๋ฆฌ์ด๋‹ค. ์˜ค๋Š˜ ๋‚˜๋Š” ์ด๊ฑธ ์ดํ•ด ํ–ˆ์ง€๋งŒ ๋ฏธ๋ž˜์˜ ๋„Œ ๋˜ ๊นŒ๋จน์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์—ฌ๊ธฐ์— ๋ฉ”๋ชจํ•ด ๋‘”๋‹ค. ๋™์  WHERE ํšŒ์› ํ…Œ์ด๋ธ”์—์„œ ํšŒ์›์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ์˜ ์กด์žฌ์—

    yaga.tistory.com

    ์ž˜ ๋˜๊ฒ ์ง€?๐Ÿ˜… ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ดค๋Š”๋ฐ ์•„๋ž˜์ฒ˜๋Ÿผ ๋‹นํ™ฉ์Šค๋Ÿฌ์šด ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธ ํ–ˆ๋‹ค.
    ํด๋ผ์ด์–ธํŠธ์—์„œ ํ˜ธ์ถœ
    ์ด์ƒํ•˜๋‹ค. "ํ† ๋ฅด"๋ผ๋Š” ์‚ฌ์šฉ์ž๋ช…์€ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋‹ค.

    ์„œ๋ฒ„ ์ฟผ๋ฆฌ ํ™•์ธ

    ๋ญ”๊ฐ€ ์ œ๋Œ€๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์€ ๋А๋‚Œ์ด๋‹ค.
    ๊ตฌ๊ธ€๋ง ๊ฒฐ๊ณผ Stringํƒ€์ž…์˜ ๋ณ€์ˆ˜ 1๊ฐœ๋งŒ ๋ฐ›์„ ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ map์œผ๋กœ ๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

    ์ด์ œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

    ์ •ํ™•ํžˆ ์ดํ•ด ํ•˜๋ ค๋ฉด ์Šคํ”„๋ง์˜ HttpMessageConvert ๋‚ด๋ถ€์ ์œผ๋กœ ๊ณต๋ถ€ํ•ด์•ผ ํ•˜๊ณ  ๋‚˜๋„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์œผ๋‹ˆ ์ด ๊ณณ์— ๊ธฐ๋กํ•˜์ง€ ์•Š๋Š”๊ฒŒ ๋‚ซ๊ฒ ๋‹ค๋Š” ํŒ๋‹จ์„ ํ–ˆ๋‹ค.
    ๋‚˜์ค‘์— ์‹œ๊ฐ„ ๋‚ด์„œ HttpMessageConvert์— ๋Œ€ํ•ด์„œ๋„ ๊ณต๋ถ€ํ•ด ๋ณด์ž.(๋‚˜ํ•œํ…Œ ํ•˜๋Š” ๋ง์ด๋‹ค.)
    ๊ด€๋ จํ•ด์„œ ํ›จ์”ฌ ์ž˜ ์ •๋ฆฌ๋œ ๋ธ”๋กœ๊ทธ ๊ธ€๋“ค์ด ๋งŽ๋‹ค.
    ์˜ค๋Š˜ ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์„ ํ–ˆ์œผ๋‹ˆ ๋‹ค์Œ๋ฒˆ์—” ์‚ฝ์งˆ ์‹œ๊ฐ„์ด ์ค„์–ด๋“ค ๊ฒƒ์ด๋‹ค.

    ๋Œ“๊ธ€