티스토리 뷰

개발

Spring Boot #1 : Spring Boot Multi Module, Gradle, JPA

살아남자제발 2020. 4. 6. 20:41

스프링부트로 웹서비스 만들기 #1

 

이 글에서의 환경

Spring Boot Multi Module

Gradle

JPA

H2 DB

PostMan

 

https://start.spring.io/

위 링크에 접속해서 스프링부트의 프로젝트를 생성한다.

 

디펜던시로는 Spring Web, Spring Data JPA, MySql, Lombok, Spring Boot Devtoos를 일단 넣었다.

2020년 04월 06일 기준이다.

 

 

GENERATE를 눌러 압축파일을 다운받아 경로에 푼다.

 

프로젝트를 연다.

나는 인텔리제이를 사용했다.

 

 

 

프로젝트를 열고 settings.gradle에 아래와 같이 적는다

rootProject.name = 'demo'

include ':demo-common', ':demo-api', ':demo-web'

 

이번엔 build.gradle에 아래와 같이 적는다.

buildscript {
	ext {
		springBootVersion = '2.2.6.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

allprojects {

	apply plugin: 'java'
	apply plugin: 'eclipse'
	apply plugin: 'idea'
	apply plugin: 'org.springframework.boot'
	apply plugin: 'io.spring.dependency-management'

	group = 'com.multi'
	version = '0.0.1-SNAPSHOT'
	sourceCompatibility = 11

	task initSourceFolders {
		sourceSets*.java.srcDirs*.each {
			if( !it.exists() ) {
				it.mkdirs()
			}
		}

		sourceSets*.resources.srcDirs*.each {
			if( !it.exists() ) {
				it.mkdirs()
			}
		}
	}

	repositories {
		mavenCentral()
	}

	dependencies {
		implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
		implementation 'org.springframework.boot:spring-boot-starter-web'
		implementation 'org.springframework.boot:spring-boot-devtools'
		compileOnly 'org.projectlombok:lombok'
		runtimeOnly 'mysql:mysql-connector-java'
		runtimeOnly 'com.h2database:h2'
		annotationProcessor 'org.projectlombok:lombok'
		testImplementation('org.springframework.boot:spring-boot-starter-test') {
			exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
		}
	}

	test {
		useJUnitPlatform()
	}

}

repositories {
	mavenCentral()
}

dependencies {
	compile project(':demo-api')
	compile project(':demo-common')
	compile project(':demo-web')
}

 

그리고 변경된 Gradle을 적용하면 아래와 같이 구성된다.

 

중간에 파란 아이콘을 낀 애들이 모듈

 

 

이제 각 멀티 모듈에 build.gradle파일을 위치 시켜야한다

 

각 각의 build.gradle 파일의 코드는 아래와 같다.

 

demo-api/build.gradle

jar {
    enabled = true
}

bootJar {
    enabled = false
}

dependencies {
    compile project(':demo-common')
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

demo-common/build.gradle

jar {
    enabled = true
}

bootJar {
    enabled = false
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

demo-web/build.gradle

jar {
    enabled = true
}

bootJar {
    enabled = false
}

dependencies {
    compile project(':demo-common')
    compile project(':demo-api')

    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

이제 설정파일을 만들어 준다.

설정파일은 properties나 yml 둘 중 선호하는 쪽을 사용하면 된다.

 

나같은 경우 yml을 사용했다.

 

 

루트 프로젝트 - src - resources 아래에 위치

프로젝트 임시 기동을 위한 application.yml의 코드이다.

후에 AWS RDS MySql 인스턴스를 만들고나서 MySql을 연동할거다.

spring:
  datasource:
    url: jdbc:h2:mem:test
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
#        show_sql: true
        format_sql: true

logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type: trace

H2 DB는 위 url 설정을 mem으로 해두면 DB설치가 없어도 알아서 메모리디비를 사용하게 된다.

즉, 따로 DB설치를 안해도 된다.

 

 

 

멀티 모듈 테스트를 위해 demo-api에 패키지 경로와 클래스를 생성한다.

 

 

 

아래는 각각의 코드다

 

@Entity
@Getter @Setter
public class Member {

    @Id @GeneratedValue
    private Long id;
    private String name;

}
@Repository
@RequiredArgsConstructor
public class MemberRepository{

    private final EntityManager em;

    public void save(Member member){
        em.persist(member);
    }

    public Member findOne(long id){
        return em.find(Member.class, id);
    }

    public List<Member> memberList(){
        return em.createQuery("select m from Member m", Member.class ).getResultList();
    }

}
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {

    private final MemberRepository memberRepository;

    @Transactional
    public String save(Member member){
        memberRepository.save(member);
        return "완료";
    }

    public Member findOne(long id){
        return memberRepository.findOne(id);
    }

    public List<Member> memberList(){
        return memberRepository.memberList();
    }
}

 

 

demo-web에도 경로와 클래스를 생성한다.

 

아래는 코드이다.

@RestController
public class MemberController {

    @Autowired
    private MemberService memberService;

    @GetMapping("/hello")
    public String hello(){
        return "hello world";
    }

    @GetMapping(value = "/mem_save")
    public void save(Member member){
        Member mem = new Member();

        mem.setName(member.getName());
        memberService.save(mem);
    }

    @GetMapping("members")
    public List<Member> memberList(){
        return memberService.memberList();
    }

}

 

 

이제 실행해보기에 앞서 가장 루트아래에 있는 Demoapplication Class에 붙어있는

@SpringBootApplication Annotaion에 어떠어떠한 패키지를 스캔하겠다고하는 변수를 달아준다.

원래 예전에는 @ComponentScan을 이용했지만 스프링부트의 버전이 업데이트되면서 이 어노테이션에 달아주게 되었다.

 

이제 실행을 해주면 아래와 같은 로그가 뜨면서 정상 기동이 될 것이다.

 

 

application.yml에서 해줬던 jpa.hibernate.ddl-auto: create로 인해 테이블이 자동생성된다.

 

 

 

원래는 테스트코드를 작성해야 하지만 이번엔 그냥 포스트맨을 쓰겠다.

 

테스트1 헬로월드 발사

잘 된다.

 

테스트2 멤버 세이브

키에는 name 밸류에는 tester를 넣고 날렸다.

오류가 없는걸 보니 잘 된듯하다.

원래 대로라면 로그확인, DB확인 등을 해야겠지만 이번엔 그냥 바로 전체 검색인 members를 날리겠다.

잘 된걸까

 

테스트3 멤버 전체 검색 (List)

테스트2번을 통해 몇명의 멤버를 더 넣어두었다.

잘 된다

 

 

 

다음 시간엔 AWS EC2, RDS(MySql)를 생성해 프로젝트와 MySql을 연결하고 빌드된 jar파일을 EC2에 올려 실행을 시켜보겠다.

 

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함