{ Spring, React } Spring(gradle) + React 프로젝트 연동
1. 사전준비: Spring Project(gradle) 세팅
VO (Value Object)
-
UserVO.java: 데이터 전송 객체로, 데이터베이스 테이블
users를 나타냄.@Getter @Setter @Entity @Table(name = "users") @SequenceGenerator(name="uno_seq_gen", sequenceName="user_seq") public class UserVO { @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="uno_seq_gen") private int uno; private String id; private String password; @CreationTimestamp private Timestamp regdate; @UpdateTimestamp private Timestamp updatedate; }
Service Layer
-
UserService.java: 비즈니스 로직과 데이터 처리를 담당.
@Service public class UserService { @Autowired private UserRepository userRepository; public UserVO createUser(String id, String password) { UserVO user = new UserVO(); user.setId(id); user.setPassword(password); return userRepository.save(user); } }
DAO (Data Access Layer)
- UserRepository.java: JpaRepository를 확장하여 CRUD 및 기타 필요한 데이터 접근 메서드 제공.
public interface UserRepository extends JpaRepository<UserVO, Integer> { }
2. Proxy 설정
- 필수 설정: React (포트 3000)와 Spring (포트 8080) 간의 통신을 위해 필요.
- CORS 문제 해결: 브라우저 보안 정책에 따라 도메인 또는 포트가 다른 서버 간 요청을 제한하는 CORS 이슈를 해결.
- package.json 설정:
"proxy": "http://localhost:8080",
3. Gradle을 이용한 프로젝트 빌드
- 프로젝트에 맞게 frontendDir, from, 및 into 경로 설정 맞추기
- CI/CD 환경 구축: 지속적 통합 및 배포 파이프라인 설정.
- Build Script: React 프로젝트 빌드 후 결과물을 Spring Boot 빌드 아티팩트에 포함.
// 프로젝트의 프론트엔드 디렉토리 경로를 정의
def frontendDir = "$projectDir/app-frontend"
// 소스셋 설정: Java 프로젝트의 리소스 디렉토리 지정
sourceSets {
main {
resources {
srcDirs = ["$projectDir/src/main/resources"]
}
}
}
// 리소스 처리 작업, React 빌드 파일 복사 작업에 의존성 설정
processResources {
dependsOn "copyReactBuildFiles"
}
// React 설치 작업 정의
task installReact(type: Exec) {
// 작업이 실행될 디렉토리 설정
workingDir "$frontendDir"
inputs.dir "$frontendDir"
group = BasePlugin.BUILD_GROUP
// 운영체제 확인 후 적절한 npm 명령어 실행
if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains ('windows')) {
commandLine "npm.cmd", "audit", "fix"
commandLine 'npm.cmd', 'install'
} else {
commandLine "npm", "audit", "fix"
commandLine 'npm', 'install'
}
}
// React 빌드 작업 정의
task buildReact(type: Exec) {
// 설치 작업에 의존
dependsOn "installReact"
workingDir "$frontendDir"
inputs.dir "$frontendDir"
group = BasePlugin.BUILD_GROUP
// 운영체제 확인 후 적절한 npm 빌드 스크립트 실행
if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains ('windows')) {
commandLine "npm.cmd", "run-script", "build"
} else {
commandLine "npm", "run-script", "build"
}
}
// 빌드된 React 파일을 Java 애플리케이션 리소스로 복사
task copyReactBuildFiles(type: Copy) {
// 빌드 작업에 의존
dependsOn "buildReact"
from "$frontendDir/build"
into "$buildDir/resources/main/static"
}