๐ ํ์ฌ ์ํฉ ๋ฐ ๋ฐฐ๊ฒฝ ์ค๋ช
ํ์ฌ ๊ฐ๊ฒ ์ฌ์ง์ ์ ๋ฐ์ดํธํ๋ ๋ก์ง์ ๋ชจ๋ ๊ธฐ์กด ์ฌ์ง์ ์ญ์ ํ ํ ์๋ก์ด ์ฌ์ง์ ๋ฎ์ด์ฐ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๊ณ ์๋ค.
- ๊ธฐ์กด ์ฌ์ง URL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ชจ๋ ์กฐํ
- ๊ธฐ์กด ์ฌ์ง URL์ DB์์ ๋ชจ๋ ์ญ์
- ์๋ก์ด ์ฌ์ง URL์ DB์ ๋ชจ๋ ์ ์ฅ
โถ ๊ตฌํ ์ฝ๋
/**
* ๊ฐ๊ฒ ์ฌ์ง์ ์
๋ฐ์ดํธํฉ๋๋ค.
*/
@Transactional
protected void updateMarketImages(Market market, List<String> imageUrls) {
// ๊ธฐ์กด ์ฌ์ง ์กฐํ
List<MarketImage> marketImageList = marketImageRepository.findAllByMarketId(market.getId());
// DB์์ ๊ธฐ์กด ์ฌ์ง URL ๋ชจ๋ ์ญ์
marketImageRepository.deleteAll(marketImageList);
// DB์ ์๋ก์ด ์ฌ์ง URL ๋ชจ๋ ์ ์ฅ
for (String imageUrl : imageUrls) {
MarketImage updateImage = MarketImage.builder()
.market(market)
.imageUrl(imageUrl)
.build();
marketImageRepository.save(updateImage);
}
}
๐จ ๋ฌธ์ ์ํฉ
ํ์ฌ ๋ฐฉ์์ ์ฌ์ง์ด ํ๋๋ง ๋ณ๊ฒฝ๋๋๋ผ๋ ๊ธฐ์กด์ ์ ์ฅ๋ ๋ชจ๋ ์ฌ์ง์ ์ญ์ ํ๊ณ ์๋ก์ด ์ฌ์ง์ ๋ค์ ์ ์ฅํ๋ ๊ตฌ์กฐ์ด๋ค. ์ด ๋ฐฉ์์ด ๋ณ๊ฒฝํ ์ฌ์ง๋ง ๋น๊ตํด์ ์ ์ฅํ๋ ๋ฐฉ์๋ณด๋ค ํจ์จ์ ์ธ์ง ์๋ฌธ์ด ๋ค์๊ณ , ์ด๋ฅผ ๊ฒํ ํ ํ์๊ฐ ์๋ค๊ณ ๋๊ผ๋ค.
โ๏ธ ์์ธ ๋ถ์
6๊ฐ์ ์ฌ์ง ์ค ํ๋๋ง ๋ณ๊ฒฝํ๋ค๊ณ ๊ฐ์ ํ ๊ฒฝ์ฐ, ๊ฐ ๋ฐฉ์์ ์ฟผ๋ฆฌ ๋น์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ธฐ์กด ๋ฐฉ์: DELETE ์ฟผ๋ฆฌ 6๋ฒ, INSERT ์ฟผ๋ฆฌ 6๋ฒ (๊ณ ์ )
- ๊ฐ์ ๋ฐฉ์: SELECT ์ฟผ๋ฆฌ 6๋ฒ, DELETE ์ฟผ๋ฆฌ 1๋ฒ, INSERT ์ฟผ๋ฆฌ 1๋ฒ
์ด๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ ์ฟผ๋ฆฌ ๋น์ฉ์ ๋ถ์ํ ํ์์ฑ์ ๋๊ผ๋ค.
โถ DB ์ฟผ๋ฆฌ ๋น์ฉ ๋ถ์
๊ฐ ์ฟผ๋ฆฌ๋ ์ฝ๊ธฐ ๋น์ฉ๊ณผ ์ฐ๊ธฐ ๋น์ฉ์ผ๋ก ๋๋ ์ ์๋ค.
- ์ฝ๊ธฐ ๋น์ฉ: ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ๊ฒ์ํ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ ์์ ์ฌ์ฉ๋
- ์ฐ๊ธฐ ๋น์ฉ: ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด์ ๋ฐ์ํ๋ ์์ ์ฌ์ฉ๋
๐ฝ SELECT (์กฐํ ์ฟผ๋ฆฌ)
- ์ฝ๊ธฐ ๋น์ฉ
- ์ธ๋ฑ์ค ์ฌ์ฉ ์ฌ๋ถ: ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ธฐ ๋น์ฉ์ด ์ค์ง๋ง, ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ์ ์ฒด ํ ์ด๋ธ์ ์ค์บํ๊ฒ ๋์ด ์ฝ๊ธฐ ๋น์ฉ์ด ์ฆ๊ฐํ๋ค.
- ์กฐ์ธ: ์ฌ๋ฌ ํ ์ด๋ธ์ ์กฐ์ธํ ๊ฒฝ์ฐ ๋์คํฌ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง์ด ์ฝ์ด์ผ ํ๋ฏ๋ก ์ฝ๊ธฐ ๋น์ฉ์ด ํฌ๊ฒ ์ฆ๊ฐํ๋ค.
- ์ฐ๊ธฐ ๋น์ฉ
- ๋ฐ์ํ์ง ์๋๋ค.
๐ฝ INSERT (์ฝ์ ์ฟผ๋ฆฌ)
- ์ฝ๊ธฐ ๋น์ฉ
- ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ํ์ง ์์ง๋ง, ๋ฐ์ดํฐ ์ค๋ณต ํ์ธ์ด ํ์ํ ๋ ์ธ๋ฑ์ค๋ฅผ ์กฐํํ๋ ๊ณผ์ ์์ ์ฝ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ ์ ์๋ค.
- ์ฐ๊ธฐ ๋น์ฉ
- ๋ฐ์ดํฐ ์ฝ์ : ๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ์ ์ฝ์ ํ๋ ๊ณผ์ ์์ ์ฐ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
- ์ธ๋ฑ์ค ๊ฐฑ์ : ์ธ๋ฑ์ค๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ, ์ฝ์ ๋ ๋ฐ์ดํฐ๋ก ์ธํด ์ธ๋ฑ์ค๋ฅผ ๊ฐฑ์ ํ๋ ๊ณผ์ ์์ ์ฐ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
- ํธ๋์ญ์ ๋ก๊ทธ ๊ธฐ๋ก: ์ฝ์ ๋ ๋ฐ์ดํฐ๋ฅผ ํธ๋์ญ์ ๋ก๊ทธ์ ๊ธฐ๋กํ๋ ๊ณผ์ ์์ ์ฐ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
๐ฝ UPDATE (๊ฐฑ์ ์ฟผ๋ฆฌ)
- ์ฝ๊ธฐ ๋น์ฉ
- ๊ฒ์ ๋น์ฉ: ๊ฐฑ์ ํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ฐพ์์ผ ํ๋ฏ๋ก ์ฝ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค. ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒ์ ๋น์ฉ์ด ์ค์ด๋ ๋ค.
- ์ฐ๊ธฐ ๋น์ฉ
- ๋ฐ์ดํฐ ๊ฐฑ์ : ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ๋ค์ ์ฐ๋ ์์ ์์ ์ฐ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
- ์ธ๋ฑ์ค ๊ฐฑ์ : ์ธ๋ฑ์ค๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ, ๊ฐฑ์ ๋ ๋ฐ์ดํฐ๋ก ์ธํด ์ธ๋ฑ์ค๋ฅผ ๊ฐฑ์ ํ๋ ๊ณผ์ ์์ ์ฐ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
- ํธ๋์ญ์ ๋ก๊ทธ ๊ธฐ๋ก: ๊ฐฑ์ ๋ ๋ฐ์ดํฐ๋ฅผ ํธ๋์ญ์ ๋ก๊ทธ์ ๊ธฐ๋กํ๋ ๊ณผ์ ์์ ์ฐ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
๐ฝ DELETE (์ญ์ ์ฟผ๋ฆฌ)
- ์ฝ๊ธฐ ๋น์ฉ
- ๊ฒ์ ๋น์ฉ: ์ญ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ํ ์ด๋ธ์ ๊ฒ์ํด์ผ ํ๋ค. ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒ์ ๋น์ฉ์ด ์ค์ด๋ ๋ค.
- ์ฐ๊ธฐ ๋น์ฉ
- ๋ฐ์ดํฐ ์ญ์ : ์ญ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์์ ์ ๊ฑฐํ๋ ์์ ์์ ์ฐ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
- ์ธ๋ฑ์ค ๊ฐฑ์ : ์ธ๋ฑ์ค๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค๋ฅผ ๊ฐฑ์ ํ๋ ๊ณผ์ ์์ ์ฐ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
- ํธ๋์ญ์ ๋ก๊ทธ ๊ธฐ๋ก: ์ญ์ ๋ ๋ฐ์ดํฐ๋ฅผ ํธ๋์ญ์ ๋ก๊ทธ์ ๊ธฐ๋กํ๋ ๊ณผ์ ์์ ์ฐ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
- ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ฒ๋ฆฌ: ์ธ๋ ํค ์ ์ฝ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ, ์ญ์ ์ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ฉฐ, ์ด๋ก ์ธํด ์ถ๊ฐ์ ์ธ ์ฐ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
โถ ์ฐ๊ธฐ ๋น์ฉ vs ์ฝ๊ธฐ ๋น์ฉ
์ผ๋ฐ์ ์ผ๋ก ์ฐ๊ธฐ ๋น์ฉ์ด ์ฝ๊ธฐ ๋น์ฉ๋ณด๋ค ๋ ๋๋ค.
๐ฝ ์ฐ๊ธฐ ๋น์ฉ
- ๋์คํฌ I/O ๋น์ฉ: ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์ ์ฅํ๋ ๊ณผ์ ์์ ๋ง์ ๋ฆฌ์์ค๊ฐ ํ์ํ๋ค.
- ํธ๋์ญ์ ๊ด๋ฆฌ: ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ํธ๋์ญ์ ๋ก๊ทธ๊ฐ ์์ฑ๋๋ฉฐ, ์ด๋ก ์ธํด ์ถ๊ฐ์ ์ธ ๋์คํฌ ๊ณต๊ฐ๊ณผ ์ฐ๊ธฐ ์์ ์ด ๋ฐ์ํ๋ค.
- ์ธ๋ฑ์ค ๊ฐฑ์ : ์ฐ๊ธฐ ์์ ์ ์ธ๋ฑ์ค๊ฐ ๊ฑธ๋ฆฐ ํ๋๋ฅผ ๊ฐฑ์ ํด์ผ ํ๋ฏ๋ก ์ถ๊ฐ์ ์ธ ์ฐ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
- ๋์์ฑ ์ ์ด: ์ฌ๋ฌ ์ฐ๊ธฐ ์์ ์ด ๋์์ ์ด๋ฃจ์ด์ง ๋, ๋ฝ ๊ด๋ฆฌ๊ฐ ํ์ํด ์ฐ๊ธฐ ๋น์ฉ์ด ์ฆ๊ฐํ๋ค.
๋์คํฌ I/O ๋น์ฉ: ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์์ ์ฝ๊ณ ์ฐ๋ ์์ ๊ณผ ๊ด๋ จ๋ ์์คํ ์์ ์๋ชจ๋ฅผ ์๋ฏธํ๋ค. ์ด ๋น์ฉ์ ๋์คํฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ฝ๊ฑฐ๋ ์ฐ๋ ๋ฐ ํ์ํ ์๊ฐ๊ณผ ์์์ ๋ํ๋ด๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ์ค์ํ ์ํฅ์ ๋ฏธ์น๋ค.
๐ฝ ์ฝ๊ธฐ ๋น์ฉ
- ๋์คํฌ ์ฝ๊ธฐ ๋น์ฉ: ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์์ ์ฝ์ด์ค์ง๋ง, ์ฐ๊ธฐ ์์ ๋ณด๋ค ๋น์ฉ์ด ๋ฎ๋ค.
- ์บ์ ์ฌ์ฉ: ์ฝ๊ธฐ ์์ ์ ๋ฉ๋ชจ๋ฆฌ ์บ์๋ฅผ ์ฌ์ฉํด ์์ฃผ ์กฐํ๋๋ ๋ฐ์ดํฐ์ ๋ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋ค.
- ํธ๋์ญ์ ๋ก๊ทธ ์์: ์ฝ๊ธฐ ์์ ์๋ ํธ๋์ญ์ ๋ก๊ทธ ๊ธฐ๋ก์ด ํ์ ์์ผ๋ฏ๋ก ๋น์ฉ์ด ์ ๊ฐ๋๋ค.
๋ฐ๋ผ์ ์ฝ๊ธฐ ์์ ์ต์ ํ๋ฅผ ์ํด ์ธ๋ฑ์ค๋ฅผ ์ ์ ํ ์ฌ์ฉํ๊ณ , ์ฐ๊ธฐ ์์ ์ ์ต์ํํ๋ ๋ฐฉ์์ผ๋ก ์ค๊ณํ๋ ๊ฒ์ด ์ข๋ค.
๐จ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ฌ์ง์ ์ ๋ฐ์ดํธํ ๋, ๋ณ๊ฒฝ๋ ์ฌ์ง๋ง DB์ ๋ฐ์ํ๋๋ก ๋ก์ง์ ๊ฐ์ ํ๋ค. ๊ธฐ์กด ์ฌ์ง๊ณผ ์๋ก์ด ์ฌ์ง์ ๋น๊ตํด ์ญ์ ํ ์ฌ์ง๊ณผ ์ถ๊ฐํ ์ฌ์ง๋ง ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
/**
* ๊ฐ๊ฒ ์ฌ์ง์ ์
๋ฐ์ดํธํฉ๋๋ค.
*/
private void updateMarketImages(Market market, List<String> imageUrls) {
// ๊ธฐ์กด ์ฌ์ง List ์กฐํ
List<MarketImage> existingMarketImages = marketImageRepository.findAllByMarketId(market.getId());
// ๊ธฐ์กด ์ฌ์ง URL List ์กฐํ
List<String> existingMarketImageUrls = existingMarketImages.stream()
.map(MarketImage::getImageUrl)
.toList();
// DB์ ์๋ ์ฌ์ง ์ ์ฅ
for (String imageUrl : imageUrls) {
if (!existingMarketImageUrls.contains(imageUrl)) {
MarketImage updateImage = MarketImage.builder()
.market(market)
.imageUrl(imageUrl)
.build();
marketImageRepository.save(updateImage);
}
}
// ์๋ก ์ถ๊ฐ๋ ๋ฆฌ์คํธ์ ์๋ ์ด๋ฏธ์ง๋ ์ญ์
for (MarketImage existingMarketImage : existingMarketImages) {
if (!imageUrls.contains(existingMarketImage.getImageUrl())) {
marketImageRepository.delete(existingMarketImage);
}
}
}
๐ ๊ฒฐ๊ณผ ๊ด์ฐฐ
๊ฐ์ ๋ ๋ฐฉ์์ ๋ถํ์ํ ์ญ์ ์ ์ฝ์ ์ ์ต์ํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ธฐ ์์ ์ ์ค์ด๊ณ ์ ์ฒด ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์๋ค. ํนํ, ๋ณ๊ฒฝ๋ ์ฌ์ง๋ง ์ฒ๋ฆฌํจ์ผ๋ก์จ ๋์คํฌ I/O์ ํธ๋์ญ์ ์ฒ๋ฆฌ ๋น์ฉ์ด ๊ฐ์ํ์์ ์ ์ ์๋ค.
๐ฝ ์ฌ์ง 3๊ฐ ์ค 1๊ฐ ๋ณ๊ฒฝ ์ ์คํ ์ฟผ๋ฆฌ
SELECT ์ฟผ๋ฆฌ 3๋ฒ, INSERT ์ฟผ๋ฆฌ 1๋ฒ, DELETE ์ฟผ๋ฆฌ 1๋ฒ์ด ์คํ๋๋ค.
๐ก ๊ณ ์ฐฐ
์ด๋ฒ ํธ๋ฌ๋ธ์ํ ์ ํตํด ์ฝ๊ธฐ ๋น์ฉ๊ณผ ์ฐ๊ธฐ ๋น์ฉ์ ๋ํด ์๊ฒ ๋์๊ณ , ์ฐ๊ธฐ ๋น์ฉ์ด ์ฝ๊ธฐ ๋น์ฉ๋ณด๋ค ๋ ๋ง์ด ์๋ชจ๋๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค. ํ์ฌ๋ ์ต๋ 6๊ฐ์ ์ฌ์ง๋ง ์ฒ๋ฆฌํ๊ณ , ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ด ํฐ ์ฑ๋ฅ ์ฐจ์ด๋ ๋ฐ์ํ์ง ์๊ฒ ์ง๋ง, ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋ ๊ฒฝ์ฐ ์ด๋ฒ ๊ฒฝํ์ด ์ ์ฉํ ๊ธฐ๋ฐ ์ง์์ด ๋ ๊ฒ ๊ฐ๋ค. ๋ฐ์ดํฐ๊ฐ ๋ง์์ง์๋ก ์ฟผ๋ฆฌ ์ฑ๋ฅ์ด ์ค์ํด์ง๋ฏ๋ก, ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ๋ด์ฉ์ด๋ผ๊ณ ์๊ฐํ๋ค.
๐ ์ฐธ๊ณ ์๋ฃ
- ๋๊ท๋ชจ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์ดํด
- ์์ธ์๋ฆฝ๋ํ๊ต ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ฐธ๊ณ