๐Ÿ“Œ [Java] DTO / ํ…Œ์ŠคํŠธ ์ฝ”๋“œ / ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ •๋ฆฌ

My Pale Blue Dotยท2025๋…„ 3์›” 27์ผ
0

JAVA

๋ชฉ๋ก ๋ณด๊ธฐ
35/35
post-thumbnail

๐Ÿ“… ๋‚ ์งœ

2025๋…„ 3์›” 27์ผ

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ


4๏ธโƒฃ DTO (Data Transfer Object) ๊ณ„์ธต

โœ… DTO๋ž€?

  • DTO๋Š” ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ์ฒด๋กœ, Controller โ†” Service โ†” Dao ๊ฐ„ ๋ฐ์ดํ„ฐ ์ด๋™์— ์‚ฌ์šฉ
  • ํ•„๋“œ, ์ƒ์„ฑ์ž, getter/setter, toString ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ์„ฑ๋จ

โœ… UserDto.java

public class UserDto {
    private String userid;
    private String username;
    private String password;
    private String role; // ex: ROLE_USER, ROLE_ADMIN

    // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž
    public UserDto() {}

    // ์ „์ฒด ํ•„๋“œ ์ดˆ๊ธฐํ™” ์ƒ์„ฑ์ž
    public UserDto(String userid, String username, String password, String role) {
        this.userid = userid;
        this.username = username;
        this.password = password;
        this.role = role;
    }

    // Getter/Setter
    public String getUserid() { return userid; }
    public void setUserid(String userid) { this.userid = userid; }

    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }

    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }

    public String getRole() { return role; }
    public void setRole(String role) { this.role = role; }

    // ๋””๋ฒ„๊น…/์ถœ๋ ฅ์šฉ
    @Override
    public String toString() {
        return "UserDto [userid=" + userid + ", username=" + username +
               ", password=" + password + ", role=" + role + "]";
    }
}

โœ… BookDto.java

public class BookDto {
    private String bookCode;
    private String bookName;
    private String publisher;
    private String isbn;

    // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž
    public BookDto() {}

    // ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋ฐ›๋Š” ์ƒ์„ฑ์ž
    public BookDto(String bookCode, String bookName, String publisher, String isbn) {
        this.bookCode = bookCode;
        this.bookName = bookName;
        this.publisher = publisher;
        this.isbn = isbn;
    }

    // Getter/Setter
    public String getBookCode() { return bookCode; }
    public void setBookCode(String bookCode) { this.bookCode = bookCode; }

    public String getBookName() { return bookName; }
    public void setBookName(String bookName) { this.bookName = bookName; }

    public String getPublisher() { return publisher; }
    public void setPublisher(String publisher) { this.publisher = publisher; }

    public String getIsbn() { return isbn; }
    public void setIsbn(String isbn) { this.isbn = isbn; }

    @Override
    public String toString() {
        return "BookDto [bookCode=" + bookCode + ", bookName=" + bookName +
               ", publisher=" + publisher + ", isbn=" + isbn + "]";
    }
}

5๏ธโƒฃ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ตฌ์กฐ (JUnit5)

โœ… ํ…Œ์ŠคํŠธ ๋ชฉ์ 

  • ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰ ํ…Œ์ŠคํŠธ (FrontController โ†’ SubController)
  • DAO ์ง์ ‘ DB ์—ฐ๋™ ํ…Œ์ŠคํŠธ
  • ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ: JUnit5

โœ… ControllerTests.java

class ControllerTests {
    FrontController fc = FrontController.getInstance(); // ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค

    @Test
    @Disabled
    void test1() {
        // ํšŒ์›๊ฐ€์ž… ์š”์ฒญ ๊ตฌ์„ฑ
        Map<String, Object> params = new HashMap<>();
        params.put("endPoint", "/user");
        params.put("serviceNo", 1);
        params.put("userid", "user01");
        params.put("username", "ํ™๊ธธ๋™");
        params.put("password", "1234");

        Map<String, Object> response = fc.execute(params);

        // ์‘๋‹ต ์ถœ๋ ฅ
        response.forEach((k, v) -> System.out.println(k + " : " + v));
    }

    @Test
    void test2() {
        // ๋„์„œ ๋“ฑ๋ก ์š”์ฒญ ๊ตฌ์„ฑ
        Map<String, Object> params = new HashMap<>();
        params.put("endPoint", "/book");
        params.put("serviceNo", 1);
        params.put("bookCode", "11111111");
        params.put("bookName", "์ž๋ฐ”์˜ ์ •์„");
        params.put("publisher", "ํ•œ๋น›์ถœํŒ์‚ฌ");
        params.put("isbn", "978-1234567890");

        Map<String, Object> response = fc.execute(params);

        // ์‘๋‹ต ์ถœ๋ ฅ
        response.forEach((k, v) -> System.out.println(k + " : " + v));
    }
}

โœ… DaoTests.java

class DaoTests {

    @Test
    @Disabled
    void test1() throws Exception {
        // DB ์—ฐ๊ฒฐ ํ™•์ธ
        UserDaoImpl userDao = UserDaoImpl.getInstance();
    }

    @Test
    @Disabled
    void test2() throws Exception {
        // ์‚ฌ์šฉ์ž ๋“ฑ๋ก ํ…Œ์ŠคํŠธ
        UserDaoImpl userDao = UserDaoImpl.getInstance();
        userDao.insert(new UserDto("aaa", "ํ™๊ธธ๋™", "1234", "ROLE_USER"));
    }

    @Test
    void test3() throws Exception {
        // ๋„์„œ ๋“ฑ๋ก ํ…Œ์ŠคํŠธ
        BookDaoImpl bookDao = BookDaoImpl.getInstance();
        bookDao.insert(new BookDto("1111", "๋ฆฌ๋ˆ…์Šค ์™„์ „์ •๋ณต", "OS์ถœํŒ", "111-111"));
    }
}

6๏ธโƒฃ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง

โœ… ๋ชฉ์ 

  • ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ Controller โ†’ Service โ†’ DB๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ์ฐจ๋‹จ
  • ์ฃผ๋กœ Controller์—์„œ ๋จผ์ € ์ˆ˜ํ–‰๋จ

โœ… UserController์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

private boolean isValid(UserDto userDto) {
    if (userDto.getUserid() == null || userDto.getUserid().length() <= 4) {
        response.put("error", "userid์˜ ๊ธธ์ด๋Š” ์ตœ์†Œ 5์ž ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.");
        return false;
    }
    if (userDto.getUserid().matches("^[0-9].*")) {
        response.put("error", "userid์˜ ์ฒซ ๋ฌธ์ž๋กœ ์ˆซ์ž๊ฐ€ ๋“ค์–ด์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
        return false;
    }
    return true;
}

์„ค๋ช…:

  • userid๋Š” 5์ž ์ด์ƒ์ด์–ด์•ผ ํ•จ
  • ์ฒซ ๋ฌธ์ž๊ฐ€ ์ˆซ์ž์ด๋ฉด ์•ˆ ๋จ
  • ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด Map<String, Object>์— status: false, message ํฌํ•จํ•˜์—ฌ ๋ฐ˜ํ™˜

โœ… BookController์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

private boolean isValid(BookDto bookDto) {
    if (bookDto.getBookCode() == null || bookDto.getBookCode().length() < 8) {
        response.put("error", "BookCode๋Š” ์ตœ์†Œ 8์ž ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.");
        return false;
    }
    if (bookDto.getBookCode().length() > 255) {
        response.put("error", "BookCode๋Š” 255์ž๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
        return false;
    }
    return true;
}

์„ค๋ช…:

  • bookCode๋Š” ์ตœ์†Œ 8์ž ์ด์ƒ, 255์ž ์ดํ•˜
  • ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ƒ์„ธํ•œ ๋ฉ”์‹œ์ง€๋ฅผ response์— ๋‹ด์•„ ๋ฐ˜ํ™˜

๐Ÿ”ฅ ์ •๋ฆฌ

ํ•ญ๋ชฉ์š”์•ฝ
DTO๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์šฉ, POJO ํด๋ž˜์Šค ๊ตฌ์„ฑ
ํ…Œ์ŠคํŠธController ๋ฐ Dao ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•œ ํ๋ฆ„ ๊ฒ€์ฆ
์œ ํšจ์„ฑ ๊ฒ€์‚ฌController ๋‹จ๊ณ„์—์„œ ํ•„์ˆ˜ ํ•„๋“œ ๊ฒ€์ฆ ๋ฐ ์˜ˆ์™ธ ์ฐจ๋‹จ ์ฒ˜๋ฆฌ

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ

  • DTO ๊ฐœ๋… ๋ฐ ์ž‘์„ฑ ๋ฐฉ์‹
  • JUnit5 ์–ด๋…ธํ…Œ์ด์…˜: @Test, @Disabled
  • Java ์ •๊ทœํ‘œํ˜„์‹ ์˜ˆ์ œ
  • ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์›์น™
profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€