๐Ÿ“Œ [Java] FrontController ๊ธฐ๋ฐ˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ ์ •๋ฆฌ

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

JAVA

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

๐Ÿ“… ๋‚ ์งœ

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

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


1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ์ „์ฒด ๊ตฌ์กฐ ๊ฐœ์š”

โœ… ๊ฐœ์š”

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” Java๋กœ ์ž‘์„ฑ๋œ ์›น ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋กœ,

FrontController ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ์š”์ฒญ์„ ํ•˜๋‚˜์˜ ์ง„์ž…์ ์—์„œ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ณ ,

๊ธฐ๋Šฅ๋ณ„ SubController๋กœ ๋ถ„๊ธฐํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.


โœ… ์ „์ฒด ์ฒ˜๋ฆฌ ํ๋ฆ„

[View ๋˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ]
     โ†“
[FrontController]
     โ†“ (endPoint ๊ธฐ์ค€ ๋ถ„๊ธฐ)
[SubController.execute()]
     โ†“
[Service (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)]
     โ†“
[Dao (DB ์ ‘๊ทผ)]
     โ†“
[MySQL - bookDB]

โœ… ์š”์ฒญ ๋ฐฉ์‹ ์˜ˆ์‹œ (Map ๊ธฐ๋ฐ˜)

Map<String, Object> params = new HashMap<>();
params.put("endPoint", "/user");       // ๋˜๋Š” "/book"
params.put("serviceNo", 1);            // ์„œ๋น„์Šค ๋ฒˆํ˜ธ
params.put("userid", "user01");
params.put("username", "ํ™๊ธธ๋™");
params.put("password", "1234");

2๏ธโƒฃ Controller ๊ณ„์ธต ๊ตฌ์กฐ

โœ… FrontController.java

public class FrontController {
    // ๊ฐ ์š”์ฒญ endPoint์— ๋”ฐ๋ผ SubController๋ฅผ ์ €์žฅํ•˜๋Š” Map
    private Map<String, SubController> map = new HashMap<>();
    private static FrontController instance; // ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค

    private FrontController() {
        init(); // ์ปจํŠธ๋กค๋Ÿฌ ์ดˆ๊ธฐํ™”
    }

    // ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๋ฐ˜ํ™˜
    public static FrontController getInstance() {
        if (instance == null) instance = new FrontController();
        return instance;
    }

    // endPoint ๋ณ„ SubController ๋“ฑ๋ก
    private void init() {
        map.put("/user", new UserController());
        map.put("/book", new BookController());
    }

    // ์‹คํ–‰ ๋ฉ”์„œ๋“œ: ์š”์ฒญ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ SubController ์‹คํ–‰
    public Map<String, Object> execute(Map<String, Object> params) {
        String endPoint = (String) params.get("endPoint"); // "/user" or "/book"
        SubController controller = map.get(endPoint); // ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ ์ฐพ๊ธฐ
        return controller.execute(params); // ์‹คํ–‰
    }
}

โœ… SubController.java

// ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค
public interface SubController {
    // ๋ชจ๋“  ํ•˜์œ„ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
    Map<String, Object> execute(Map<String, Object> params);
}

โœ… UserController.java (์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํฌํ•จ)

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

โœ… BookController.java (์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํฌํ•จ)

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

3๏ธโƒฃ DAO ๊ณ„์ธต ๊ตฌ์กฐ

โœ… ๊ณตํ†ต ์‚ฌํ•ญ

  • DB: MySQL - bookDB
  • ์—ฐ๊ฒฐ ์ •๋ณด:
    • URL: jdbc:mysql://localhost:3306/bookDB
    • ID: root
    • PW: 1234
  • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋จ

โœ… UserDaoImpl.java (insert ๊ธฐ๋Šฅ)

// ์‚ฌ์šฉ์ž ๋“ฑ๋ก
public int insert(UserDto userDto) throws SQLException {
    try {
        // SQL ์ค€๋น„
        pstmt = conn.prepareStatement("insert into tbl_user values(?,?,?,?)");
        // ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ
        pstmt.setString(1, userDto.getUserid());
        pstmt.setString(2, userDto.getUsername());
        pstmt.setString(3, userDto.getPassword());
        pstmt.setString(4, "ROLE_USER"); // ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ๊ถŒํ•œ
        // ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
        return pstmt.executeUpdate();
    } catch (SQLException e) {
        // ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ throw
        throw new SQLException("USERDAO's INSERT SQL EXCEPTION!!");
    } finally {
        // ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ
        try { pstmt.close(); } catch (Exception e2) {}
    }
}

โœ… BookDaoImpl.java (insert ๊ธฐ๋Šฅ)

// ๋„์„œ ๋“ฑ๋ก
public int insert(BookDto bookDto) throws SQLException {
    try {
        // SQL ์ค€๋น„
        pstmt = conn.prepareStatement("insert into tbl_book values(?,?,?,?)");
        // ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •
        pstmt.setString(1, bookDto.getBookCode());
        pstmt.setString(2, bookDto.getBookName());
        pstmt.setString(3, bookDto.getPublisher());
        pstmt.setString(4, bookDto.getIsbn());
        // ์‹คํ–‰
        return pstmt.executeUpdate();
    } catch (SQLException e) {
        // ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
        throw new SQLException("BOOKDAO's INSERT SQL EXCEPTION!!");
    } finally {
        // ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ
        try { pstmt.close(); } catch (Exception e2) {}
    }
}

๐Ÿ”ฅ ์ •๋ฆฌ

  • FrontController ํŒจํ„ด์œผ๋กœ ๋ชจ๋“  ์š”์ฒญ์„ ํ†ตํ•ฉ ์ฒ˜๋ฆฌ
  • Controller๋Š” endPoint์™€ serviceNo๋กœ ๊ธฐ๋Šฅ ๋ถ„๊ธฐ
  • Dao์—์„œ๋Š” DB์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋ฉฐ insert ๊ตฌํ˜„ ์™„๋ฃŒ
  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋„ ํฌํ•จ๋˜์–ด ์žˆ์–ด ์‹ค๋ฌด ํ๋ฆ„๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌ์„ฑ๋จ

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

  • Java MVC ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
  • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด (Singleton Design Pattern)
  • DAO ํŒจํ„ด๊ณผ JDBC ์‚ฌ์šฉ๋ฒ•
  • JUnit 5 ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ
profile
Here, My Pale Blue.๐ŸŒ

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