[CS] DTO์™€ DAO

Yumya's recordยท2025๋…„ 4์›” 2์ผ

SKALA

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

๐Ÿšš DTO, DAO ์ •๋ฆฌ ๐Ÿšš

DTO

Data Transfer Object
๋ฐ์ดํ„ฐ ์ด๋™์„ ์œ„ํ•œ ๊ฐ์ฒด
์™ธ๋ถ€์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋ณด๋‚ผ ๋•Œ๋‚˜ ๊ฐ ๊ณ„์ธต๊ฐ„ ์ด๋™ ์‹œ ์‚ฌ์šฉํ•œ๋‹ค.

DTO๋Š” ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ์„ ๋‹ด๊ณ  ์žˆ์–ด getter, setter๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋กœ์ง์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.
(ํƒ๋ฐฐ ๋ฐ•์Šค๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค. ํƒ๋ฐฐ ๋ฐ•์Šค = DTO, ํƒ๋ฐฐ ๋‚ด์šฉ๋ฌผ = ๋ฐ์ดํ„ฐ)

๊ตฌํ˜„ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ฐ€๋ณ€, ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€๋ณ€ ๊ฐ์ฒด

setter๋กœ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹

public class exampleDto {
	private String name;

	public void setName(String newName) {
    	this.name = newName;
    }
    
    public String getName() {
    	return name;
    }
}

๋ถˆ๋ณ€ ๊ฐ์ฒด

์ƒ์„ฑ์ž์™€ getter๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹
๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

public class exampleDto {
	private String name;

	public exampleDto(String name) {
    	this.name = name;
    }
    
    public String getName() {
    	return name;
    }
}

๋ฐ์ดํ„ฐ ์ด๋™์„ ์œ„ํ•œ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ณ€๋ณด๋‹ค๋Š” ๋ถˆ๋ณ€์œผ๋กœ ๊ตฌํ˜„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ์šฉ๋„๋กœ๋งŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋˜, ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ ์‚ฌ์šฉํ•˜๋Š” DTO๋ฅผ ๊ตฌ๋ถ„ํ•ด ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜์— ์ข‹๋‹ค.


Spring boot ๊ธฐ๋ฐ˜ REST API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค.

Request dto

@AllArgsConstructor
@NoArgsConstructor
@Getter
public class requestDto {
	private String name;
}

์™ธ๋ถ€์—์„œ name์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ DTO์ด๋‹ค.

@getter๋ฅผ ์‚ฌ์šฉํ•ด getter ๋ฉ”์„œ๋“œ๋ฅผ ๋”ฐ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ, ์ƒ์„ฑ์ž ๋˜ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ด๋ฅผ ์ด์šฉํ•ด ์„œ๋ฒ„์—์„œ DTO์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// front -> back

{
	"name" : "์•ˆ๋…•"
}

์™ธ๋ถ€์—์„œ body์— JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ํ•ด๋‹น DTO์—์„œ ์ •์˜ํ•œ ๋ฐ์ดํ„ฐ ์ด๋ฆ„(name)์„ ๋‹ด์•„ ์ „๋‹ฌํ•œ๋‹ค.

Response dto

@Getter
public class responseDto {
	private final String name;
    
    public responseDto(String name) {
    	this.name = name;
    }
}

์„œ๋ฒ„์—์„œ Entity๋ฅผ DTO๋กœ ๋งตํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜๊ณ , @Getter๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ ์ด์œ 

  1. View ๊ณ„์ธต๊ณผ DB ๊ณ„์ธต์˜ ์—ญํ•  ๋ถ„๋ฆฌ
    ๊ฐ์ฒด ํ‘œํ˜„ ๊ณ„์ธต๊ณผ ์ €์žฅ ๊ณ„์ธต์˜ ์—ญํ•  ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  2. Entity ๊ฐ์ฒด ๋ณ€๊ฒฝ ๋ฐฉ์ง€
    ๊ฐ ๊ณ„์ธต์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š”๋ฐ, Entity๊ฐ€ ์š”์ฒญ ๋ฐ์ดํ„ฐ์— ๋งž๊ฒŒ ๋ณ€ํ™”๋˜๋ฉด์„œ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ DTO๋ฅผ ์‚ฌ์šฉํ•ด Entity ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๋ฉด์„œ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  3. ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง ์œ ์ง€
    Entity ํด๋ž˜์Šค์— ํ‘œํ˜„์„ ์œ„ํ•œ ํ•„๋“œ๋‚˜ ๋กœ์ง ์ถ”๊ฐ€ ์‹œ ๊ฐ์ฒด ์„ค๊ณ„๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฐ๋‹ค. ๋”ฐ๋ผ์„œ DTO์— ํ‘œํ˜„์„ ์œ„ํ•œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•ด ์‚ฌ์šฉํ•˜๋ฉด์„œ Entity์˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง์„ ์ง€ํ‚จ๋‹ค.

DAO

Data Access Object
Database์— ์ ‘๊ทผํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด
์ฆ‰ ๋ฐ์ดํ„ฐ์˜ CRUD ๊ธฐ๋Šฅ์„ ์ „๋‹ดํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

// DAO Interface
public interface UserDAO {
    User getUserById(int id);
    List<User> getAllUsers();
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}
// DAO
public class UserDAOImpl implements UserDAO {
    private Connection connection;

    public UserDAOImpl(Connection connection) {
        this.connection = connection;
    }

    @Override
    public User getUserById(int id) throws SQLException {
        String query = "SELECT * FROM users WHERE id = ?";
        try (PreparedStatement psmt = connection.prepareStatement(query)) {
            psmt.setInt(1, id);
            try (ResultSet rs = psmt.executeQuery()) {
                if (rs.next()) {
                    return new User(rs.getInt("id"), rs.getString("name"), rs.getString("email"));
                }
            }
        }
        return null;
    }

    // ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ (insert, update, delete) ๊ตฌํ˜„ ๊ฐ€๋Šฅ
}

PreparedStatement๋ฅผ ์‚ฌ์šฉํ•ด ์ฟผ๋ฆฌ๋ฌธ(CRUD)์„ ์‹คํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์™€ ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

public class UserService {
    private UserDAO userDAO;

    public UserService(UserDAO userDAO) {
        this.userDAO = userDAO;
    }

    public User getUserById(int id) {
        return userDAO.getUserById(id);
    }
}

์„œ๋น„์Šค ๊ณ„์ธต์—์„œ๋Š” DAO ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์‚ฌ์šฉ ์ด์œ 

  1. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ DB ์ ‘๊ทผ ์ฝ”๋“œ ๋ถ„๋ฆฌ
    DAO ์‚ฌ์šฉ์œผ๋กœ ์„œ๋น„์Šค ๊ณ„์ธต๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ, DAO๋Š” ๋ฐ์ดํ„ฐ CRUD๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.
  2. ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ฆ๊ฐ€
  3. DB ๋ณ€๊ฒฝ ์‹œ ์œ ์—ฐํ•œ ๋Œ€์‘ ๊ฐ€๋Šฅ
    OS ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ DAO ๋‚ด๋ถ€ ๋กœ์ง๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ๋ณด์•ˆ์„ฑ๊ณผ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
    PreparedStatement๋ฅผ ์‚ฌ์šฉํ•ด SQL ์ธ์ ์…˜์„ ๋ฐฉ์ง€ํ•จ์œผ๋กœ์จ ๋ณด์•ˆ์„ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ๋กœ์ง์ด ํ•œ ๊ณณ์— ๋ชจ์—ฌ ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๋‹ค.

์ฐธ๊ณ -DTO, DAO
์ฐธ๊ณ -DTO, DAO ์‚ฌ์šฉ ์ด์œ 
์ฐธ๊ณ -DAO ์˜ˆ์‹œ

profile
๐Ÿ€ ูฉ(หŠแ—œห‹*)ูˆ ๐Ÿ€

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