close_btn
로그인, 회원가입후 더 많은 혜택을 누리세요 로그인 회원가입 닫기

스프링 오랜만에 다시 보내 새롭네요. 우연히 접할 기회가 있어서 스프링 부트를 접하게 되었습니다. 기존에 주로 회사에서는 php, ruby on rails, javascript 등 스크립트 언어를 해오다 보니 꽤나 쉽지 않네요. 뭐 이걸로 프로젝트를 한 번 하면 금방 배우겠죠. 루비 같은 경우도 작년까지 전혀 몰랐는데, 프로젝트를 하다보니 점점 알게 되더라구요. 

1. 셋팅

이걸 하면서 gradle이라는 것을 알게 되었는데, 보니까 maven 같은 것인데, 확실히 maven보단 설정 문법이 더욱 깔끔하고 좋네요. maven에서는 xml 지옥이라 알아보기 힘들었는데, gradle은 그냥 스크립트 형식으로 되어있어서 더 알아보기 쉽게 되어있습니다. 

build.gradle

 

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.10.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'spring-boot'

sourceCompatibility = 1.5
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile("org.springframework.boot:spring-boot-starter-web:1.2.0.RELEASE")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("mysql:mysql-connector-java:5.1.34")
}

 

맨 위에 buildscript부분은 jar파일 만들기 위해서 필요한 것 같아요. 그 외에 plugin이 spring-boot가 추가되었는데, bootRun 이런 task 등이 추가 되어있어요.

dependencies는 스프링 부트를 쓰려면 spring-boot-starter-web이 있어야 하고, 데이터연동하는 것을 하기 위해서는 spring-boot-starter-data-jpa가 있어야 하고, mysql을 쓰려면 mysql-connector-java를 추가해야 해요.
jpa에는 하이버네이트가 내장되어 있어요.

 

2. 메인 클래스

스프링 부트는 예전 개발방식이랑 틀리게 톰캣 받고, web.xml을 셋팅하고, 웹개발을 위한 셋팅이 필요없이 기존 java 실행 방식으로 실행하며 이 실행과 동시에 내장된 톰캣이 작동하여 서버를 만들어버립니다. 아래와 같이 메인클래스를 만들어버리면 그냥 웹서버애플리케이션이 뜹니다.

Application.java

 

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

    }
}

보면 예전에 자바처음 배울 때 쓰는 public static void main클래스로 실행만 합니다. @SpringBootApplication어노테이션을 붙이면 최초 기본셋팅으로 톰캣을 띄워서 8080포트로 서버를 만들어 줍니다.

 

3. 모델 생성

그 전에 접속할 db정보를 입력해야 합니다. 
application.properties

 

spring.datasource.url=jdbc:mysql://127.0.0.1/sosi?autoReconnect=true&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.database=mysql
spring.jpa.show-sql=true

 

대략 설정값은 저런데 ddl-auto부분이 create-drop은 서버 재시작 때마다 테이블을 날려버리는 옵션입니다. 처음에 개발할 때에는 매우 편리합니다. 값을 매번 지우지 않고도 서버만 재시작해도 처음부터 다시 개발 해놓은 것을 테스트해볼 수 있으니깐염.

Sosi.java

 

 

@Entity public class Sosi { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; @Column(nullable = false) private String name; @OneToMany @JoinColumn(name="sosi_id", referencedColumnName="id") private List<Schedule> scheduleList; public Sosi() { } public Sosi(String name) { this.name = name; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Schedule> getScheduleList() { return scheduleList; } public void setScheduleList(List<Schedule> scheduleList) { this.scheduleList = scheduleList; } }

 

 

Schedule.java

 

@Entity
public class Schedule {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JsonBackReference
    private Sosi sosi;

    @Column
    private String program;

    public Schedule() {
    }

    public Schedule(Sosi sosi, String program) {
        this.sosi = sosi;
        this.program = program;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Sosi getSosi() {
        return sosi;
    }

    public void setSosi(Sosi sosi) {
        this.sosi = sosi;
    }

    public String getProgram() {
        return program;
    }

    public void setProgram(String program) {
        this.program = program;
    }

}

 

두 개의 모델이 1:N관계 입니다. Sosi가 스케줄을 여러개 가질 수 있는 구조입니다. 여기서 Schedule에는 ManyToOne을 걸었는데, @JsonBackReference도 같이 넣었습니다. 이걸 안 넣으면 서로 계속 참조해서 JSON출력할 때 무한루프에 빠지더라구요-_- 이제 Sosi참조는 json에서 안쓰는 그런 옵션 같습니다.

그리고 예전에는 Dao만들어서 뭔가 하이버네이트세션 가져와서 그걸 통해서 했던 것 같은데, Spring Data JPA에서는 JpaRepository라는 것을 제공하는데, 이것을 통하면 해당 모델에 대해서 CRUD를 제공합니다. 

SosiRepository.java

 

public interface SosiRepository extends JpaRepository<Sosi, Long>{
}

 

ScheduleRepository.java

 

public interface ScheduleRepository extends JpaRepository<Schedule, Long> {
}

 

 

4. 컨트롤러 생성

간단하게 소녀시대 정보를 가져오는 컨트롤러와 스케줄 추가 및 가져오는 컨트롤러를 생성합니다.

SosiController.java

 

@RestController
@RequestMapping("/sosi")
public class SosiController {

    @Autowired
    private SosiRepository sosiRepository;

    @RequestMapping("{sosiId}")
    public Sosi getSosi(@PathVariable Long sosiId) {
        Sosi sosi = sosiRepository.findOne(sosiId);
        return sosi;
    }
}

 

ScheduleController.java

 

@RestController
@RequestMapping("/schedule")
public class ScheduleController {

    @Autowired
    private ScheduleRepository scheduleRepository;

    @Autowired
    private SosiRepository sosiRepository;

    @RequestMapping("{scheduleId}")
    public Schedule getSchedule(@PathVariable Long scheduleId) {
        Schedule schedule = scheduleRepository.findOne(scheduleId);
        Sosi sosi = schedule.getSosi();
        return schedule;
    }

    @RequestMapping("add/{sosiId}")
    public Schedule addSchedule(@PathVariable Long sosiId, @RequestParam(value="program") String program) {
        Sosi sosi = sosiRepository.findOne(sosiId);
        Schedule schedule = scheduleRepository.save(new Schedule(sosi, program));

        return schedule;
    }
}

 

소스 내용을 보면 Repository클래스를 통해 Autowired하면 기본 인터페이스를 해당 모델기반 구현체를 만듭니다. 그 구현체에서 save, findOne 등 함수를 통해 데이터 삽입 및 가져올 수 있습니다.

 

5. 기본 값 삽입

기본적으로 소녀시대 멤버를 삽입하고 시작할 수 있습니다. 기존 application.properties에 하이버네이트 설정을 재시작하면 꺼지게 해놨기 때문에 기본적으로 앱을 시작할 때 값을 삽입하고 하면 편하게 테스트할 수 있습니다.

Application.java

 

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
        SosiRepository sosiRepository = context.getBean(SosiRepository.class);

        sosiRepository.save(new Sosi("태연"));
        sosiRepository.save(new Sosi("윤아"));
        sosiRepository.save(new Sosi("수영"));
        sosiRepository.save(new Sosi("효연"));
        sosiRepository.save(new Sosi("유리"));
        sosiRepository.save(new Sosi("티파니"));
        sosiRepository.save(new Sosi("써니"));
        sosiRepository.save(new Sosi("서현"));
    }
}

 

 

6. 실행

소녀시대 정보 가져오기
https://localhost:8080/sosi/1

211B254A54B2519F08

스케줄 추가하기
http://localhost:8080/schedule/add/1?program=무한도전

2117153454B2521F3A

다시 소녀시대정보 가져오기
http://localhost:8080/sosi/1

25611D3C54B2528A16

번호 제목 글쓴이 날짜 조회 수
공지 소스자료는 직접 올려주세요 게임존 2017.06.06 573
275 베노미 인존 2024.03.04 36
274 게임 서버 클래스값 인존 2024.03.04 42
273 던파 CT입니다 [2] file 꺼즈 2024.02.04 324
272 포토샵 꿀팁 아가입니다 2024.02.04 28
271 블소 아이템 코드 한글입니다, file 팡234 2023.12.03 219
270 블소 신석지급방법 입니다. file 팡234 2023.12.03 94
269 블소 아이템 코드 정리해봤습니다. file 팡234 2023.12.03 102
268 블소 아이디 생성방법입니다 file 팡234 2023.12.02 102
267 프로젝트 신루 NPC스크립트2 [4] 자택경비 2023.11.06 95
266 프로젝트 신루 NPC 스크립트 작성하기 자택경비 2023.10.22 36
265 프로젝트신루 전직NPC추가하기 [7] file 자택경비 2023.10.17 87
264 NPC 추가 및 스크립트 추가 [2] file 자택경비 2023.10.17 67
263 최강의군단 신규(NightWalker)나이트워커 스크립트 [2] file 잼과베이컨 2023.07.31 201
262 이터널시티(EternalCity)1_ 스크립트 [1] file 잼과베이컨 2023.07.31 310
261 소울워커(SoulWorker) 스팀 asm 스크립트 file 잼과베이컨 2023.07.31 122
260 아바(A.V.A) AOB, ASM 스크립트 file 잼과베이컨 2023.07.31 49
259 데카론 한글 던전리스트 file 일루션 2023.06.21 131
258 데카론 한글 맵리스트 file 일루션 2023.06.21 57
257 스톤에이지 8.0 서버 소스 file 김철수12 2023.05.31 310
256 천년 상승무공 자동지급 애꾸형님 2023.05.10 157
255 천년 무공 자동지급 애꾸형님 2023.05.10 101
254 sega saturn region patcher file 강사내 2023.05.10 14
253 4.6 버전 스킬 목록 직접 파싱하여 뽑아낸 자료 입니다. file 여기룽 2023.04.02 162
252 0g 팩 file 막눈 2023.01.12 198
251 Lunia Online Source file paking 2021.03.15 321
250 in_game_shop [1] file BlueServer 2021.02.08 203
249 미니파이터 SPR 이미지 압축해제 소스 [1] file 애플민트 2021.01.11 260
248 포토샵 단축키 모음 아악브로임다 2020.11.29 78
247 MS-OFFICE CD를 넣으라는 메시지가 나올 때.. 아악브로임다 2020.11.29 48
246 이 컨트롤을 활성화하여 사용하려면 클릭하십시오 메시지 해결 방법 아악브로임다 2020.11.29 35
245 인터넷(IE7) 사용 중 [액세스 허용]을 묻는 대화상자가 안 나오도록.. 아악브로임다 2020.11.29 26
244 구글 번역기를 홈페이지에 달기 아악브로임다 2020.11.29 78
243 테일즈런너 소스 file 예서 2020.10.27 349
242 Maven, m2eclipse설치 후 eclipse에서 WTP용 프로젝트 생성 삽질! 애니콜런 2020.09.20 101
241 HttpCore를 이용한 Basic HTTP Server 만들기 file 애니콜런 2020.09.20 98
» [Spring Boot] 간단한 RestAPI 및 JPA 예제. file 애니콜런 2020.09.20 75
239 No$gba 3D 향상 file 애니콜런 2020.09.20 91
238 Solaris 10 MQSL 설치 과정 애니콜런 2020.09.20 67
237 어레이 오브 바이트 스캔 소스 file 레이크123 2020.08.22 60
236 자동인젝션소스 file 레이크123 2020.08.21 112
235 미르2 C# 버전 운영자 명령어 절타 2020.08.12 274
234 운영자 명령어 한글로 변환하기-2 늑대풍 2020.08.11 175
233 운영자 명령어 한글로 변환하기-1 늑대풍 2020.08.11 428
232 서버이름 수정하기 늑대풍 2020.08.11 219
231 새로운 케릭 생성시 다른 종족 못고르게 하기 [1] 늑대풍 2020.08.11 199
230 [어둠의전설] [스크립트] 철포삼 토끼토끼토끼 2020.07.14 204
229 Vcruntime140.dll 파일 file 리타이어 2020.07.05 59
228 트릭스터 마이샵 설정방법 (영문) [3] file 해우김123 2020.06.15 335
227 트릭스터 맵 코드 file 해우김123 2020.06.06 176
226 트릭스터 아이템코드 file 해우김123 2020.06.06 365