์งํ์ฒ ์ญ ์์น ๊ธฐ๋ฐ ๋ ํฐ๋ง ์ผ์ดํฌ ๋ฆฌ๋ทฐ ํ๋ซํผ
- ์ง๋๋ฅผ ํ์ธํ๋ฉฐ ์ํ๋ ์ผ์ดํฌ ๊ฐ๊ฒ์ ์์น๋ฅผ ํ์ธํ ์ ์์ด์ ๐บ
- ์งํ์ฒ ์ญ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๊น์ด ์ผ์ดํฌ ๊ฐ๊ฒ๋ฅผ ๊ฒ์ํ ์ ์์ด์ ๐
- ๋ฐฉ๋ฌธํ๋ ์ผ์ดํฌ ๊ฐ๊ฒ์ ๋ณ์ ๊ณผ ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ธธ ์ ์์ด์ โญ๏ธ
- ์ข์์ ๊ธฐ๋ฅ์ ํตํด ์ข์๋ ๊ฐ๊ฒ๋ค์ ์ ์ฅํด๋ ์ ์์ด์ โค๏ธ
- ๋ง์ด ํ์ด์ง ๊ธฐ๋ฅ์ ํตํด ํ๋ ๊ธฐ๋ก์ ๋ณผ ์ ์์ด์ ๐๐ปโโ๏ธ
- OS : Ubuntu 20.04
- Java Version : JDK 11
- Framework : Spring boot 2.7.1
- ORM : Spring Data JPA
- Security : Spring Security
- Test : JUnit5, mockito, testcontainer, jacoco
- DB : MySQL
- Build : Gradle
- CI / CD : Github Actions
- Infrastructure : AWS EC2, RDS, S3, Docker
ํ๋์ ๋ฆฌ๋ทฐ๋ฅผ ์ญ์ ํ ๋ ์ฐ๊ด๋ ๋ฆฌ๋ทฐ ์ด๋ฏธ์ง(N๊ฐ)์ ๋ฆฌ๋ทฐ ํ๊ทธ(M๊ฐ)๋ฅผ cascade๋ก ํ๋ฒ์ ์ญ์ ํ๊ณ ์ ํ์๋ค. (๋ฆฌ๋ทฐ ์ด๋ฏธ์ง์ ๋ฆฌ๋ทฐ ํ๊ทธ๋ ์ค๋ก์ง ๋ฆฌ๋ทฐ์์ ์ฐ๊ด์ฑ๋ง ์๊ธฐ์ ํ๋ฒ์ ์ญ์ ํด๋ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ์๋ค.)
ํ์ง๋ง ์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ 1:N ๊ด๊ณ์์ 1์ ์ญ์ ํ ๋ N๋ฒ(๋ฆฌ๋ทฐ ์ด๋ฏธ์ง,ํ๊ทธ ๊ฐ์ ๋งํผ)์ ์ญ์ ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ๊ฒ ๋๋๋ฐ ์ด๊ฒ ์ฑ๋ฅ์์ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
๊ทธ๋์ bulk delete๋ก ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด ํ๋ฒ์ ์ฟผ๋ฆฌ๋ก ๋๋ ๋ฐ์ดํฐ ์ญ์ ๊ฐ ๊ฐ๋ฅํ๋๋ก ๋ณ๊ฒฝํด์ฃผ์๋ค.
@Modifying(clearAutomatically = true)
@Query("delete from ReviewImage ri where ri.review.id in :ids")
void deleteReviewImagesByReviewIds(@Param("ids") List<Long> ids);
- ๋ฒํฌ ์ฐ์ฐ ์ฟผ๋ฆฌ๋ 1์ฐจ ์บ์๋ฅผ ํฌํจํ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ๋ฌด์ํ๊ณ ๋ฐ๋ก query๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ ์์์ฑ ์ปจํ
์คํธ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ ์ ์๋ค. ๋ฐ๋ผ์
@Modifying
์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค. - ๋ํย
@Modifying
์ ์ฌ์ฉํ ๋ยclearAutomatically=true
์์ฑ์ ์ฃผ์ด, ์ฐ์ฐ ์ง ํ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ฐ๋์ ์ด๊ธฐํํด ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํด์ฃผ์ด์ผ ํ๋ค. - ๋ ๋์๊ฐ, ๊ฐ๊ฒ ์ญ์ ์ ์ญ์ ํ ๋์ฉ๋ ๋ฆฌ๋ทฐ๋ค๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ค ์ญ์ ์๋ ์ ์ฉํด์ฃผ์๋ค.
ํ ์คํธ ์ค ํ๊ธ์ ์ฌ์ฉํ๋ฉด ํ๊ธ์ด ๊นจ์ ธ ํ ์คํธ์ ์คํจํ๋ ๋ฌธ์ ๋ฅผ ๊ฒช์๋ค. mockMvc ์ค์ ์ UTF-8 ์ธ์ฝ๋ฉ ํํฐ๋ฅผ ์ถ๊ฐํด์ฃผ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
@BeforeEach
public void setUp() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx)
.addFilters(new CharacterEncodingFilter("UTF-8", true))
.alwaysDo(print())
.build();
}
2. @WebMvcTest๋ฅผ ์ฌ์ฉํ ์ฌ๋ผ์ด์ค ํ
์คํธ์์ JPA metamodel must not be empty!
์๋ฌ ๋ฐ์ ๋ฌธ์
WebMvcTest ์ ๊ฒฝ์ฐ ์น๊ณผ ๊ด๋ จ๋ ์์กด์ฑ๋ง ์ฃผ์
๋ฐ๋๋ค. ๋ฐ๋ผ์ ์ปจํธ๋กค๋ฌ ์ฌ๋ผ์ด์ค ํ
์คํธ๋ฅผ ํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
ํด๋น ๋ฌธ์ ๋ ๋ฉ์ธํด๋์ค์ ๋ฑ๋ก๋์ด ์๋ @EnableJpaAuditing
๊ณผ ๊ด๋ จ๋ JPA ๊ด๋ จ๋ ์ฃผ์
์ด ์์ด ๋ํ๋๋ ๋ฌธ์ ์๋ค.
ํตํฉํ
์คํธ์๋ค๋ฉด ๋ชจ๋ ๋น๋ค์ ์ฃผ์
๋ฐ๊ธฐ ๋๋ฌธ์ ์๊ด์์๊ฒ ์ง๋ง @WebMvcTest
์์๋ ๋ํ๋ ์ ์๋ ๋ฌธ์ ์๋ค.
@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {
}
config ํจํค์ง์ ๋ฐ๋ก JpaAuditingConfig ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํด์ค์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
1. git repo clone
git clone https://github.com/Daltokki-develop/cakestation-be.git
2. ํ๋ก์ ํธ ํด๋๋ก ์ด๋
cd cakestation-be
3. ํ๋ก์ ํธ ๋น๋
./gradlew build
4. ๋์ปค ์ด๋ฏธ์ง ๋น๋
docker build -t cakestation-server .
5. ๋์ปค ์ปจํ ์ด๋ ์คํ
docker run -itd -p 8080:8080 -it --name cakestation-server cakestation-server