Salenote์ ๊ฒฝ์ฐ WAS๊ฐ DB๋ฅผ ๊ตฌ์ฑํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์์ ๋ง ์ํํ๊ธฐ ๋๋ฌธ์ (MVP ๊ธฐ์ค)
JPA๋ฅผ ์ฌ์ฉํ ์ด์ ๊ฐ ์๋ค๊ณ ์๊ฐํด JDBC Templete๋ฅผ ์ฌ์ฉํ์๋ค.
๋ง์ Salenote ํ๋ก์ ํธ๋ฅผ ์์ํ๋ ์ด๋ค ๊ธฐ์ค์ผ๋ก class๋ฅผ ๋ถ๋ฅํ ์ง, ์ด๋ฆ์ ๋ญ๋ก ํ ์ง ๊ณ ๋ฏผ์ด ๋๋ค.
domain, entity, dao, dto, vo์ ๋ํ ๋ช ํํ ๊ฐ๋ ์ด ์ก๊ธฐ์ํด ๋ค์ํ ํฌ์คํ ์ ๋๋ฌ๋ณธ ๋ค ๋๋ฆ๋๋ก ์ ๋ฆฌํ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก๋ ์๋์ ๊ฐ์ ๋ก์ง์ ํ์ฑํ๋ค.
0. client์๊ฒ ์์ฒญ์ด ์ด
1. controller๊ฐ ๋ฐ์ service ๋ก์ง ์คํ
2. service๋ dao๋ฅผ ์คํ
(์๋น์ค ํน์ฑ ์ WAS์์ schema๋ฅผ ์ ์ํ์ง ์์ domain์ ํ์ ์์!)
3. SQL๋ฅผ ์์ฑํด๋ dao์์ query ์คํ
3. dao๋ก ์กฐํํ ๊ฐ์ฒด๋ dto๋ก ๋ฐํ
4. ๋ค์ service์์ dto๋ฅผ client๊ฐ ์ํ๋ ํ์์ผ๋ก ๋ณ๊ฒฝ
5. ์ด์๊ฒ ์ ๋ฆฌํ ๊ฐ์ฒด๋ฅผ client์๊ฒ -> controller
domain & entity
์ฃผ๋ก JPA๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ schema๋ฅผ ์ ์ํ๊ธฐ ์ํด ์ฌ์ฉ
์ค์ DB์ ๋งค์นญ
@Getter
@NoArgsConstructor
@Entity
public class Member {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
private String name;
private String password;
private String email;
}
dao
DB ์ปค๋ฅ์ ํด๋์ค
query๋ฅผ ์์ฑํด ๋ฐ์ดํฐ๋ฅผ CRUD ํ๋ ์ฉ๋
@Repository
public class GameInfoDao {
private final JdbcTemplate jdbcTemplate;
public GameInfoDao(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
public GameInfo gameDetailInfoFindById(Long id) {
String sql = "select * from public.game_id_name where app_id = ?";
try {
return jdbcTemplate.queryForObject(sql, gameRowMapper(), id);
} catch (IncorrectResultSizeDataAccessException e) {
throw new CommonException(ResponseCode.INVALID_GAME_ID);
}
}
private RowMapper<GameInfo> gameRowMapper() {
return (rs, rowNum) -> {
GameInfo game = new GameInfo();
game.setId(rs.getString("id"));
game.setName(rs.getString("name"));
game.setDetailJson(rs.getString("detail"));
return game;
};
}
}
๐ฌ dto์ vo๊ฐ ์๋นํ ์ ๋งคํ ๋ถ๋ถ์ด ์๋๋ฐ ๋ด๊ฐ ์ฐธ์ฌํ๋ ํ๋ก์ ํธ์์๋ dto๋ ์ธ๋ถ์์ ๋ค์ด์ค๊ณ ๋๊ฐ๋ ํ์์์๋ง ์ฌ์ฉํ๊ณ vo๋ ์๋น์ค ๋ก์ง ๋ด๋ถ์์ ์ค๊ณ ๊ฐ๋ ๊ฐ์ฒด๋ก ์ฌ์ฉํ๋ค.
dto
์๋น์ค ๋ก์ง์์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ์ฉ๋
vo์ ์ญํ ์ด ์๋ฐํ ๋๋์ด์ ธ์์ง ์๋ค
@Setter
@Builder
public class GameDetailInfoDto {
@JsonProperty
private String id;
@JsonProperty
private String name;
@JsonProperty
private String headerImage;
public static GameDetailInfoDto of(GameDetailInfoVo vo) {
return builder()
.id(vo.getId())
.name(vo.getName())
.headerImage(vo.getHeaderImage())
.build();
}
}
vo
์๋น์ค ๋ก์ง์์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ์ฉ๋
dto์ ๋น์ทํ์ง๋ง read only๋ผ๋ ๊ฐ๋ฐ์ ์ฌ์ด์ ์๋ฌต์ ? ๋ฃฐ์ ๊ฐ์ง
@Builder
@Getter
@ToString
public class GameDetailInfoVo {
private final String id;
private final String name;
private final String headerImage;
}
'๊ฐ๋ฐ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring batch - JobInstanceAlreadyCompleteException ํด๊ฒฐ (0) | 2024.01.14 |
---|---|
JDBC Templete + PostgreSql ERROR (Can't infer the SQL type to use for an instance of java.util.ArrayList.) (0) | 2022.05.09 |
์คํ๋ง ์น ๊ฐ๋ฐ ๋ฐฉ์ (static / MVC / API) (0) | 2022.03.03 |
Spring ํ๋ก์ ํธ ์์ฑ (Gradle) (0) | 2022.03.03 |
ZonedDateTime (UTC -> KST) (0) | 2022.02.23 |