/cakestation-be

๐Ÿฐ Cake Review Platform "Cakestation" BE Repo ๐Ÿฐ

Primary LanguageJavaMIT LicenseMIT

Cake Station BE ๐Ÿฐ ๐Ÿš

Service Description ๐Ÿ‘€

์ง€ํ•˜์ฒ  ์—ญ ์œ„์น˜ ๊ธฐ๋ฐ˜ ๋ ˆํ„ฐ๋ง ์ผ€์ดํฌ ๋ฆฌ๋ทฐ ํ”Œ๋žซํผ

  • ์ง€๋„๋ฅผ ํ™•์ธํ•˜๋ฉฐ ์›ํ•˜๋Š” ์ผ€์ดํฌ ๊ฐ€๊ฒŒ์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š” ๐Ÿ—บ
  • ์ง€ํ•˜์ฒ  ์—ญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€๊นŒ์šด ์ผ€์ดํฌ ๊ฐ€๊ฒŒ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์š” ๐Ÿš‰
  • ๋ฐฉ๋ฌธํ–ˆ๋˜ ์ผ€์ดํฌ ๊ฐ€๊ฒŒ์— ๋ณ„์ ๊ณผ ๋ฆฌ๋ทฐ๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์–ด์š” โญ๏ธ
  • ์ข‹์•„์š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ข‹์•˜๋˜ ๊ฐ€๊ฒŒ๋“ค์„ ์ €์žฅํ•ด๋‘˜ ์ˆ˜ ์žˆ์–ด์š” โค๏ธ
  • ๋งˆ์ด ํŽ˜์ด์ง€ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ™œ๋™ ๊ธฐ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š” ๐Ÿƒ๐Ÿปโ€โ™€๏ธ

Tech Stack ๐Ÿ› 

- 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 

Major Issues

์ฟผ๋ฆฌ ์„ฑ๋Šฅ ๊ด€๋ จ ์ด์Šˆ

๋ฆฌ๋ทฐ ์‚ญ์ œ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ๋ฌธ์ œ

ํ•˜๋‚˜์˜ ๋ฆฌ๋ทฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์—ฐ๊ด€๋œ ๋ฆฌ๋ทฐ ์ด๋ฏธ์ง€(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 ์†์„ฑ์„ ์ฃผ์–ด, ์—ฐ์‚ฐ ์ง ํ›„ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ๋” ๋‚˜์•„๊ฐ€, ๊ฐ€๊ฒŒ ์‚ญ์ œ์‹œ ์‚ญ์ œํ•  ๋Œ€์šฉ๋Ÿ‰ ๋ฆฌ๋ทฐ๋“ค๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋“ค ์‚ญ์ œ์—๋„ ์ ์šฉํ•ด์ฃผ์—ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ๊ด€๋ จ ์ด์Šˆ

1. ์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ ์ค‘, MockMvc ์‘๋‹ต ์‹œ ํ•œ๊ธ€ ๊นจ์ง ๋ฌธ์ œ

ํ…Œ์ŠคํŠธ ์ค‘ ํ•œ๊ธ€์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ๊ธ€์ด ๊นจ์ ธ ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๋‹ค. 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 ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์คŒ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Docker ๐Ÿณ

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