Spring

Spring μΈν…”λ¦¬μ œμ΄ Service, Common, Batch λͺ¨λ“ˆ λΆ„λ¦¬ν•˜κΈ° (Maven)

ν‘μ‹œλ°” 2023. 9. 17. 21:24

πŸ™„ λ°°κ²½

토이 ν”„λ‘œμ νŠΈμ™€ νšŒμ‚¬ ν”„λ‘œμ νŠΈμ—μ„œ Spring, IntelliJ, Maven을 기반으둜 λͺ¨λ“ˆ 뢄리λ₯Ό ν•˜λ©΄μ„œ μ•Œκ²Œλœ λͺ¨λ“ˆ 뢄리 방법과 λͺ¨λ“ˆ 뢄리 κ³Όμ •μ—μ„œ κ²ͺ을 수 μžˆλŠ” 문제λ₯Ό ν•΄κ²°ν•˜λŠ” μ„€μ • 방법에 λŒ€ν•΄ κ³΅μœ ν•˜κ³ μž ν•œλ‹€.

πŸ‘ λͺ¨λ“ˆ 뢄리λ₯Ό ν•΄μ•Ό ν•˜λŠ” 이유?

- μ˜μ‘΄μ„± μ΅œμ†Œν™”

예λ₯Ό λ“€μ–΄, λ™μΌν•œ λͺ¨λ“ˆμ—μ„œ 배치 μ„œλΉ„μŠ€λ₯Ό κ°œλ°œν•  λ•ŒλŠ” μŠ€ν”„λ§ μ‹œνλ¦¬ν‹°κ°€ ν•„μš” 없을 수 μžˆλŠ”λ°, μ΄λ•Œ λ™μΌν•œ λͺ¨λ“ˆμ΄λΌλŠ” 이유둜 κ°•μ œλ‘œ μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° μ˜μ‘΄μ„±μ„ ν¬ν•¨ν•˜κ²Œ λ˜λ©΄μ„œ 개발/ν…ŒμŠ€νŠΈ κ³Όμ •μ—μ„œ μ‹œνλ¦¬ν‹° λ•Œλ¬Έμ— 영ν–₯을 받을 수 μžˆλ‹€.

 

λͺ¨λ“ˆμ„ λΆ„λ¦¬ν•˜λ©΄ ν•„μš”ν•œ μ΅œμ†Œ μ˜μ‘΄μ„±λ§Œ κ΄€λ¦¬ν•¨μœΌλ‘œμ¨ μ΄λŸ¬ν•œ μ˜μ‘΄μ„± κ΄€λ ¨ 문제/영ν–₯을 κ³ λ €ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

- μœ μ§€λ³΄μˆ˜

νŠΉμ • λͺ¨λ“ˆμ— μž₯μ• κ°€ λ°œμƒν•œλ‹€λ©΄ ν•΄λ‹Ή λͺ¨λ“ˆλ§Œ ν™•μΈν•˜λ©΄ 되기 λ•Œλ¬Έμ— 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μ‰¬μ›Œμ§„λ‹€. λ˜ν•œ, μž₯μ• λ‘œ ν•΄λ‹Ή λͺ¨λ“ˆμ΄ κ°‘μž‘μŠ€λŸ½κ²Œ μ’…λ£Œλœλ‹€κ³  해도 λ‹€λ₯Έ μ„œλΉ„μŠ€ λͺ¨λ“ˆλ“€μ€ 영ν–₯을 λ°›μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν”Όν•΄λ₯Ό μ΅œμ†Œν™”ν•  수 μžˆλ‹€λŠ” μž₯점도 μžˆλ‹€.

0. μ€€λΉ„

ν¬μŠ€νŒ…μ— μ‚¬μš©λœ ν™˜κ²½μ€ λ‹€μŒκ³Ό κ°™λ‹€.

 

- JDK17

- IntelliJ

- Maven

- Spring Boot 3.1.3

 

κ°€μž₯ ν”ν•˜κ³  μ˜ˆμ‹œλ‘œ μ μ ˆν•˜λ‹€κ³  μƒκ°ν•˜λŠ” μ„œλΉ„μŠ€, 곡톡, 배치 λͺ¨λ“ˆ 3개둜 뢄리해보렀고 ν•œλ‹€.

1. ν”„λ‘œμ νŠΈ 생성

2. λͺ¨λ“ˆ μƒμ„±ν•˜κΈ°

File > New > Module > New Module에 μ ‘κ·Όν•΄μ„œ service, batch, common을 μƒμ„±ν•œλ‹€.

 

 

λͺ¨λ“ˆμ„ λͺ¨λ‘ μƒμ„±ν•˜λ©΄ μ•„λž˜μ™€ 같은 ꡬ쑰가 λœλ‹€.

 

3. 각 λͺ¨λ“ˆμ— μ˜μ‘΄μ„± μΆ”κ°€ν•˜κΈ°

각 λͺ¨λ“ˆμ— ν•„μš”ν•œ μ˜μ‘΄μ„±μ„ pom.xml에 μΆ”κ°€ν•œλ‹€.

 

이름 μΆ”κ°€ν•œ λͺ¨λ“ˆ
service web, security, security-test, common
batch batch, batch-test, common
common data-jpa, mariadb, h2
parent lombok, starter-test

lombokκ³Ό starter-testλŠ” μ–΄λ””μ—μ„œλ„ μ“Έ 수 있기 λ•Œλ¬Έμ— parent λͺ¨λ“ˆμ— μ˜μ‘΄μ„±μ„ μΆ”κ°€ν–ˆλ‹€.

4. ν”ŒλŸ¬κ·ΈμΈ μΆ”κ°€ν•˜κΈ°

spring-boot-maven-plugin ν”ŒλŸ¬κ·ΈμΈμ„ μΆ”κ°€ν•œλ‹€.

(ν•΄λ‹Ή ν”ŒλŸ¬κ·ΈμΈμ€ νŒ¨ν‚€μ§• ν•  λ•Œ executable jar 파일둜 ꡬ쑰λ₯Ό λ³€κ²½ν•΄ μ£ΌλŠ” 역할을 ν•œλ‹€.)

 

spring-boot-maven-pluginλŠ” 메인 ν΄λž˜μŠ€κ°€ ν¬ν•¨λœ λͺ¨λ“ˆμ—λ§Œ μΆ”κ°€ν•΄μ•Ό ν•˜λ―€λ‘œ, 라이브러리 역할을 ν•˜λŠ” common λͺ¨λ“ˆ 외에 service, batch λͺ¨λ“ˆμ— λ³„λ„λ‘œ μΆ”κ°€ν•œλ‹€.

(common에도 ν¬ν•¨ν•˜λ©΄ main 클래슀λ₯Ό μ°Ύμ§€ λͺ»ν•΄ νŒ¨ν‚€μ§•μ— μ‹€νŒ¨ν•˜κ²Œ λœλ‹€.)

 

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

 

ν”ŒλŸ¬κ·ΈμΈκΉŒμ§€ μΆ”κ°€κ°€ μ™„λ£Œλ˜λ©΄, 기본적인 λͺ¨λ“ˆ λΆ„λ¦¬λŠ” 이걸둜 끝이 λ‚œλ‹€.

ν•˜μ§€λ§Œ μ΄λŒ€λ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λ €κ³  ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•  μˆ˜λ°–μ— μ—†λ‹€.

 

이제 μ„œλΉ„μŠ€ λͺ¨λ“ˆμ—μ„œ JPA와 common λͺ¨λ“ˆμ„ μŠ€μΊ”ν•˜λŠ” μ„€μ • 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

5. μ„€μ •

serviceμ—μ„œλŠ” common λͺ¨λ“ˆμ— μžˆλŠ” ν΄λž˜μŠ€λ“€μ„ ν•¨κ»˜ μ‚¬μš©ν•  κ²ƒμ΄λ―€λ‘œ λ•Œλ¬Έμ—, common λͺ¨λ“ˆ νŒ¨ν‚€μ§€κΉŒμ§€ ν¬ν•¨ν•΄μ„œ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ„ ν•΄μ•Ό ν•œλ‹€.

 

@SpringBootApplication(scanBasePackages = {"com.example"})
public class ServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringApplication.class, args);
    }
}

 

service λͺ¨λ“ˆμ˜ νŒ¨ν‚€μ§€ κ²½λ‘œλŠ” com.example.service이고, common λͺ¨λ“ˆμ˜ νŒ¨ν‚€μ§€ κ²½λ‘œλŠ” com.example.common μ΄λ―€λ‘œ μƒμœ„ νŒ¨ν‚€μ§€ 경둜인 com.example κΉŒμ§€λ§Œ μž…λ ₯ν•˜λ©΄ κ΄€λ ¨ λͺ¨λ“  섀정을 κ°€μ§€κ³  올 수 μžˆλ‹€. λ§Œμ•½, νŒ¨ν‚€μ§€ κ²½λ‘œκ°€ κ³΅ν†΅λœ 뢀뢄이 μ—†κ±°λ‚˜ λ‹€λ₯΄κ²Œ λ‚˜λˆ μ•Ό ν•˜λŠ” λ“± λ‹€λ₯Έ κ²½μš°κ°€ μžˆλ‹€λ©΄ ν•„μš”μ— 따라 μΆ”κ°€μ μœΌλ‘œ 경둜λ₯Ό μž‘μ„±ν•˜λ©΄ λœλ‹€.

 

ν•˜μ§€λ§Œ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ„ ν–ˆμŒμ—λ„, JPAλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ Repository λΆ€λΆ„μ—μ„œ ν•΄λ‹Ή Bean을 μ°Ύμ§€ λͺ»ν•œλ‹€λŠ” λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

 

보톡 JPAλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ common λͺ¨λ“ˆμ— Entity, Repository λ“± JPA와 κ΄€λ ¨λœ 클래슀λ₯Ό μž‘μ„±ν•  텐데, 이듀을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 별도 섀정이 ν•„μš”ν•˜λ‹€.

 

@Configuration
@EntityScan(basePackages = "com.example.common.entity")
@EnableJpaRepositories(basePackages = "com.example.common.repository")
@EnableJpaAuditing
public class JpaConfig {

}

 

Spring Data JPAμ—μ„œ μ§€μ›ν•˜λŠ” @EntityScan, @EnableJpaRepositories μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μ—”ν‹°ν‹° νŒ¨ν‚€μ§€μ™€ Repository νŒ¨ν‚€μ§€ 경둜λ₯Ό λ”°λ‘œ μ„€μ • νŒŒμΌμ— μž‘μ„±ν•΄μ•Ό service λͺ¨λ“ˆμ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

λ§Œμ•½ BaseEntity λ“±μ˜ 곡톡 μ—”ν‹°ν‹°λ₯Ό μ‚¬μš©ν•˜λŠ” 경우라면 @EnableJpaAuditing도 ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ JPA κ΄€λ ¨ 섀정을 ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— μž‘μ„±ν•˜λ©΄ κ΄€λ¦¬ν•˜κΈ° μ’‹λ‹€.

 

REFERENCE

https://stackoverflow.com/questions/70833195/spring-boot-multi-module-spring-boot-maven-plugin-compilation-failure