๐โ๋ฆฌ๋ทฐ๋ ๋จ์ ๋๊ธ์ด ์๋๋ค โ ReviewService๋ก ๋ณธ ๊ถํ ๊ธฐ๋ฐ ์ฌ์ฉ์ ํผ๋๋ฐฑ ์์คํ โ
๐ 2025๋ 5์ | โ๏ธ by ๋ฐ์ฐฌํฌ |
๐งญ ๊ฐ๋ฐ ๋๊ธฐ: ๋ฆฌ๋ทฐ๋ ์ ๋ขฐ ๊ธฐ๋ฐ์ ์ฝํ ์ธ ์ด๋ค
๋ง์ ์จ๋ผ์ธ ๊ฐ์ ํ๋ซํผ์์ ๋ฆฌ๋ทฐ๋ ๋จ์ํ ํ๊ฐ ๊ธฐ๋ฅ์ฒ๋ผ ๋ณด์ด์ง๋ง,
์ค์ ๋ก ์ฌ์ฉ์์ ์ ๋ขฐ, ๊ฐ์ฌ์ ํํ, ์๋น์ค ์ฑ์ฅ์ ํต์ฌ ์ถ์ด๋ค.
์ด๋ฒ์ ๊ตฌํํ ReviewService
๋ ๋จ์ํ ๋๊ธ ์ ์ฅ ๊ธฐ๋ฅ์ด ์๋,
โ์๊ฐ์๋ง ์์ฑ ๊ฐ๋ฅ + ์ค๋ณต ๋ฆฌ๋ทฐ ๋ฐฉ์ง + ์์ฑ ์๊ฐ ํฌ๋งท ์ฒ๋ฆฌ + ๊ตฌ์กฐ์ ํ์ฅ์ฑ ํ๋ณดโ
๋ฅผ ๋ชฉํ๋ก ์ค๊ณ๋ ๋ฆฌ๋ทฐ ๊ด๋ฆฌ ๋ชจ๋์ด๋ค.
๐ฏ ํต์ฌ ์ค๊ณ ์์ฝ
๊ธฐ๋ฅ | ์ค๊ณ ๋ฐฉํฅ |
---|---|
๋ฆฌ๋ทฐ ์กฐํ | ์์ฑ์ผ์ ํฌ๋งท ํฌํจํ์ฌ ์ฌ์ฉ์ ์นํ์ ์ผ๋ก ์ ๊ณต |
๋ฆฌ๋ทฐ ๋ฑ๋ก | SRP ๊ธฐ๋ฐ, ์ค๋ณต ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์กฐ |
๋ฆฌ๋ทฐ ์์ฑ ๊ถํ ์ฒดํฌ | ์๊ฐ ์ฌ๋ถ + ์ค๋ณต ์์ฑ ์ฌ๋ถ ์ด์ค ๊ฒ์ฆ |
DAO ๋ถ๋ฆฌ | DB ์์ ๊ณผ ์๋น์ค ๋ก์ง์ ๋ช ํํ ๋ถ๋ฆฌ |
์์ธ/ํธ๋์ญ์ ์ฒ๋ฆฌ | ์ถํ ํ์ฅ ๊ฐ๋ฅ ๊ตฌ์กฐ ํ๋ณด (Spring ๋์ ๊ณ ๋ ค) |
๐ง ์ฌ์ฉ ๊ธฐ์ ์คํ
ํญ๋ชฉ | ๋ด์ฉ |
---|---|
์ธ์ด | Java 17 |
๋ฐ์ดํฐ๋ฒ ์ด์ค | MySQL |
ORM ๋ฐฉ์ | ์ง์ DAO ๋ฐฉ์ (MyBatis ์๋) |
์๊ฐ ์ฒ๋ฆฌ | LocalDateTime + DateTimeFormatter |
๊ตฌ์กฐ ํจํด | Service Layer + DAO + DTO |
์์ธ ์ฒ๋ฆฌ | RuntimeException ๊ธฐ๋ฐ, ๊ธ๋ก๋ฒ ์์ธ ์ ํ ๊ณ ๋ ค |
๐ง ์ฃผ์ ๋ก์ง ๊ตฌํ
1๏ธโฃ ๋ฆฌ๋ทฐ ์กฐํ: getReviewsByLectureId
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
for (ReviewDTO dto : list) {
if (dto.getCreatedAt() != null) {
dto.setCreatedAtFormatted(dto.getCreatedAt().format(formatter));
} else {
dto.setCreatedAtFormatted("");
}
}
โ ์๋ฒ ๋จ์์ ๋ ์ง ํฌ๋งท ์ฒ๋ฆฌ โ ํ๋ก ํธ๋ ๋จ์ ์ถ๋ ฅ๋ง ๋ด๋น
โ
null
๋ฐฉ์ด๋ก ์์ธ ์์ ์ฑ ํ๋ณด
๐ ์ฌ์ฉ์ UX ๊ด์ ์์ โ๋ฆฌ๋ทฐ ์๊ฐ ํ์โ๋ ์ฝํ ์ธ ์ ๋ขฐ๋์ ํฐ ์ํฅ์ ์ค๋ค.
2๏ธโฃ ๋ฆฌ๋ทฐ ๋ฑ๋ก: insertReview & addReview
public void addReview(ReviewDTO dto) {
reviewDAO.insertReview(dto);
}
addReview()
๋insertReview()
์ ๋ณ์นญ(alias) โ ๋์ผ ๊ธฐ๋ฅ์ ๋ช ํํ ์ฉ๋ ๋ถ๋ฆฌ- SRP ์์น ์ ์ฉ: ๋ฆฌ๋ทฐ ๋ฑ๋ก ์ธ ๋ก์ง ์์ โ ์ ์ง๋ณด์ ์ฉ์ด
โ ํฅํ API ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋๋ผ๋ ๋ด๋ถ ๋ก์ง์ ๊ทธ๋๋ก ์ ์ง ๊ฐ๋ฅ
3๏ธโฃ ๋ฆฌ๋ทฐ ์์ฑ ๊ถํ ์ฒดํฌ: canWriteReview
public boolean canWriteReview(int userId, int lectureId) {
return hasEnrolled(userId, lectureId) && !hasReviewed(userId, lectureId);
}
- ์๊ฐ ์ฌ๋ถ + ์ค๋ณต ์ฌ๋ถ ์ด์ค ์ฒดํฌ
- ๋น๋ก๊ทธ์ธ ์ฌ์ฉ์์ ๋ฆฌ๋ทฐ ์์ฑ ์๋๋ฅผ ์์ ํ ์ฐจ๋จ
โ ์ค๋ฌด์์๋ ๋ฆฌ๋ทฐ ์กฐ์ ๋ฐฉ์ง์ ์ฌ์ฉ์ ๊ฒฝํ ๋ณดํธ๋ฅผ ์ํ ํ์ ์ค๊ณ ํฌ์ธํธ
4๏ธโฃ ๊ตฌ์กฐ ๋ถ๋ฆฌ: DAO ๊ธฐ๋ฐ ๊ณ์ธตํ ์ค๊ณ
this.reviewDAO = new ReviewDAO(); // DAO ์ฃผ์
๊ณ์ธต | ์ญํ |
---|---|
Controller | ์ฌ์ฉ์ ์์ฒญ ๋ถ๊ธฐ (์: /review/register) |
Service (ReviewService ) |
๋น์ฆ๋์ค ํ๋จ (๊ถํ, ์ค๋ณต ์ฌ๋ถ, ํฌ๋งท ์ฒ๋ฆฌ ๋ฑ) |
DAO (ReviewDAO ) |
DB ์์ (insert, select, count ๋ฑ) |
DTO (ReviewDTO ) |
๋ฐ์ดํฐ ์ ๋ฌ ๊ฐ์ฒด |
โ ์ ์ง๋ณด์ ์ ์๋น์ค ๋ก์ง๋ง ํ ์คํธ ๊ฐ๋ฅ
โ DB ๋ณ๊ฒฝ์ด ์์ด๋ DAO๋ง ์์ ํ๋ฉด ๋จ โ ๊ณ์ธต ๋ ๋ฆฝ์ฑ ํ๋ณด
๐ ์์ธ ์ฒ๋ฆฌ ๋ฐ ํธ๋์ญ์ ์ ๋ต
- ํ์ฌ ํธ๋์ญ์
์
SqlSession
๊ธฐ๋ฐautocommit
๊ตฌ์กฐ โ ๋จ์ ์์ ์๋ ์ถฉ๋ถ - ๋ณตํฉ ์ฒ๋ฆฌ (๋ฆฌ๋ทฐ ๋ฑ๋ก + ๋ก๊ทธ ๊ธฐ๋ก ๋ฑ)์์
@Transactional
๋ก ์ ํ ํ์
try {
...
} catch (Exception e) {
throw new RuntimeException("โ ๋ฆฌ๋ทฐ ๋ฑ๋ก ์ค ์ค๋ฅ ๋ฐ์", e);
}
โถ ๋ก๊ทธ ๋ฉ์์ง๋ ๋ก๊น ์์คํ ์ฐ๋์ ์ํ ์ถ๋ฐ์ ์ด๋ฉฐ,
ํฅํ AOP ๊ธฐ๋ฐ ๊ธ๋ก๋ฒ ์์ธ ํธ๋ค๋ง ๊ตฌ์กฐ๋ก๋ ํ์ฅ ๊ฐ๋ฅ
๐ ์ค๋ฌด ์ค๊ณ ํฌ์ธํธ & ๋ฆฌ๋ทฐ ํจํดํ
๊ธฐ๋ฅ ์์ | ์ค๋ฌด ์ ๋ต |
---|---|
์ฌ์ฉ์ ๊ถํ ์ฒดํฌ | ๊ฐ์ ์๊ฐ ์ฌ๋ถ๋ enrollment ํ
์ด๋ธ ๊ธฐ์ค |
์ค๋ณต ๋ฆฌ๋ทฐ ๋ฐฉ์ง | lectureId + userId ์กฐํฉ ์ ์ผ์ฑ ์ฒดํฌ |
ํฌ๋งท ์ฒ๋ฆฌ ์ฑ ์ | ๋ทฐ๋จ์ด ์๋ ์๋น์ค๋จ์์ ์ฒ๋ฆฌํ์ฌ ์ผ๊ด์ฑ ํ๋ณด |
ํ ์คํธ ์ค๊ณ | canWriteReview() ์ getReviewsByLectureId() ๋ ๋จ์ ํ
์คํธ ํต์ฌ ๋์ |
ํ์ฅ ๊ณ ๋ ค | ์ถ์ฒ ๋ฆฌ๋ทฐ ์ ๋ ฌ, ์ฒจ๋ถ ์ด๋ฏธ์ง ๋ฑ ํ์ฅ ์ ๊ตฌ์กฐ ์ ์ง ๊ฐ๋ฅ |
๐ ๊ฐ์ ๋ฐ ํ์ฅ ์์ด๋์ด
ํญ๋ชฉ | ์ ์ |
---|---|
๋ณ์ ํ๋ ์ถ๊ฐ | rating ํ๋ ํฌํจํ์ฌ 1~5์ ๊ธฐ์ค ์ ๋ ํ๊ฐ |
๋ฆฌ๋ทฐ ์ ๊ณ ๊ธฐ๋ฅ | ๋ถ์ ์ ํ ๋ฆฌ๋ทฐ ๋์์ ์ํ ์ ๊ณ /์ฐจ๋จ API ๋์ |
๊ด๋ฆฌ์ ๊ฒํ ๊ธฐ๋ฅ | ๋ฆฌ๋ทฐ ๋ฑ๋ก ํ ๊ด๋ฆฌ์ ์น์ธ ๊ตฌ์กฐ ๋์ ๊ฐ๋ฅ |
ํ์ด์ง ์ฒ๋ฆฌ | ๋ฆฌ๋ทฐ ์ ๋ง์ ๊ฒฝ์ฐ, offset ๊ธฐ๋ฐ LIMIT ์ฒ๋ฆฌ ๋์
|
๋ฆฌ๋ทฐ ํต๊ณ API | ํ๊ท ํ์ , ๋ฆฌ๋ทฐ ์ ๋ฑ์ ์ ๊ณตํ๋ ํต๊ณ API ๊ตฌ์ฑ |
โ ๊ธฐ๋ฅ ์์ฝ
๊ธฐ๋ฅ | ์ค๋ช |
---|---|
๋ฆฌ๋ทฐ ์กฐํ | ์์ฑ์ผ ํฌ๋งท ํฌํจ ๋ฆฌ์คํธ ๋ฐํ |
๋ฆฌ๋ทฐ ๋ฑ๋ก | DTO ๊ธฐ๋ฐ insert ์ฒ๋ฆฌ, alias ๋ฉ์๋ ํฌํจ |
๊ถํ ๊ฒ์ฌ | ์๊ฐ ์ฌ๋ถ + ๊ธฐ์กด ์์ฑ ์ฌ๋ถ ์ฒดํฌ |
๊ณ์ธต ๊ตฌ์กฐ | Service โ DAO โ DB ๋ถ๋ฆฌ ์ค๊ณ |
์์ธ ์ฒ๋ฆฌ | RuntimeException์ผ๋ก ์์ธ ์ถ์ํ ๋ฐ ํ์ฅ ์ฌ์ง ํ๋ณด |
๐งพ ํ๊ณ โ ๋ฆฌ๋ทฐ๋, ์ ์ ์ ์ฝํ ์ธ ์ฌ์ด์ ์ธํฐ๋์ ์ด๋ค
์ด๋ฒ ReviewService
๊ตฌํ์ ํตํด ๋๋ ์ ์ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์๋,
โ์ฝํ ์ธ ์๋น ์ดํ์ ํ๋์ ์ ์ ๋ ๋ก์ง์ผ๋ก ๊ธฐ๋กํ๋ ๊ฒโ์ด๋ผ๋ ์ ์ด์๋ค.
- ๋ฆฌ๋ทฐ๋ ์ ์ ์ ์๊ฒฌ์ด์ ๊ฐ์ฌ์ ํ๋ซํผ์ ํผ๋๋ฐฑ ์๋จ
- ๊ถํ ์ฒดํฌ, ์ค๋ณต ๋ฐฉ์ง, ํฌ๋งท ํต์ผํ๋ ์ ๋ขฐ์ฑ๊ณผ ํ์ง์ ํต์ฌ
- ๊ณ์ธต ๋ถ๋ฆฌ, ํ ์คํธ ๊ฐ๋ฅ์ฑ, ํ์ฅ์ฑ๊น์ง ๊ณ ๋ คํด์ผ ์ค๋ฌด์์ ์ง์ ๊ฐ๋ฅํ ์ฝ๋๊ฐ ๋๋ค