• SEARCH

    통합검색
  • GAMEZONE
    • 커뮤니티
      • 공지사항
      • 유저게시판
        • 등업게시판
        • 출석체크
        • 정회원 무료자료실
      • 스크린샷
      • 인증자료실
    • 리니지
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 메이플스토리
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 바람의나라
      • 자유게시판
      • 홍보게시판
      • 자료게시판
        • 유틸자료실
        • 소스자료실
        • 클라이언트
        • 팩 자료실
      • 연구게시판
        • 개발내역
        • 질문과답변
        • 기타
      • 강의게시판
        • DR
        • CR
        • 구버전
        • 클라이언트 개조
        • 노하우 게시판
        • 게임공략 & 팁
    • 다크에덴
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 믹스마스터
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 라그나로크
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 기타게임
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 게임강의
    • 비베&포토샵
      • 자유게시판
      • 자료실
        • 일반자료실
        • 포인트 자료실
      • 노하우게시판
      • 포토샵게시판
    • 모바일
      • 게임공략
      • 포인트 자료실
      • 유틸자료실
      • 자유게시판
  • 기타게임 소스자료실
    • 기타게임 소스자료실 기타 ()
    • [Spring Boot] 간단한 RestAPI 및 JPA 예제.

      • 애니콜런
      • 2020.09.20 - 22:39 90

    스프링 오랜만에 다시 보내 새롭네요. 우연히 접할 기회가 있어서 스프링 부트를 접하게 되었습니다. 기존에 주로 회사에서는 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

    Attached file
    e93ca4d1780af1c54dba8e81d3d59416.png 52.0KB 0a6df7b0177c6bba79ed591e32a34b66c.png 61.2KB 00fccd81acba92ff30e51eedfb4f3e376.png 58.4KB 0
    이 게시물을..
    N
    0
    0
    • 소울워커(SoulWorker) 스팀 asm 스크립트잼과베이컨
    • 4
      애니콜런

    애니콜런 님의 최근 글

    작성 글이 없습니다.

    애니콜런 님의 최근 댓글

    작성 댓글이 없습니다.
    글쓴이의 서명작성글 감추기 
    댓글 쓰기 에디터 사용하기 닫기
    • view_headline 목록
    • 14px
    • 소울워커(SoulWorker) 스팀 asm 스크립트
    • 목록
      view_headline
    × CLOSE
    전체 던파 5 뮤 18 천상비 프로젝트신루 5 아이온 18 어둠의전설 28 리니지2 7 크로노스 5 칼온라인 3 기타 194
    기본 (193) 제목 날짜 수정 조회 댓글 추천 비추
    기타 정렬 검색
    • 소스자료는 직접 올려주세요
      2017.06.06 - 16:16 665
    193
    기타
    입력과 출력1
    a74654 2025.09.26 - 01:09 29
    192
    기타
    변수명 지정과 C언어 프로그램의 구조
    a74654 2025.09.26 - 01:08 22
    191
    기타
    문자열형 변수와 논리변수
    a74654 2025.09.26 - 01:08 10
    190
    기타
    논리적 오류와 아스키코드
    a74654 2025.09.26 - 01:07 15
    189
    기타
    자료형(코딩의 이해)
    a74654 2025.09.25 - 18:42 31
    188
    기타
    자료형 코딩의 이해
    a74654 2025.09.24 - 20:07 20
    187
    기타
    C언어 시작하기2
    a74654 2025.09.24 - 20:06 17
    186
    기타
    c언어 개발환경 만들기
    a74654 2025.09.24 - 20:05 19
    185
    기타
    c언어 기초 배우기
    a74654 2025.09.24 - 19:57 29
    184
    기타
    c언어 출력 인사법
    닉쿤이람이 2025.08.04 - 14:16 38
    183
    기타
    BDO 영어 클라이언트 인터페이스
    Yireeli 2024.04.13 - 08:54 68
    182
    기타
    포토샵 꿀팁
    아가입니다 2024.02.04 - 09:38 56
    181
    기타
    블소 아이템 코드 한글입니다,
    팡234 2023.12.03 - 22:33 285
    180
    기타
    블소 신석지급방법 입니다.
    팡234 2023.12.03 - 22:31 135
    179
    기타
    블소 아이템 코드 정리해봤습니다.
    팡234 2023.12.03 - 22:28 143
    178
    기타
    블소 아이디 생성방법입니다
    팡234 2023.12.03 - 00:22 149
    177
    기타
    최강의군단 신규(NightWalker)나이트워커 스크립트
    잼과베이컨 2023.07.31 - 18:16 238
    176
    기타
    이터널시티(EternalCity)1_ 스크립트
    잼과베이컨 2023.07.31 - 18:08 369
    175
    기타
    소울워커(SoulWorker) 스팀 asm 스크립트
    잼과베이컨 2023.07.31 - 18:05 158
    174
    기타
    아바(A.V.A) AOB, ASM 스크립트
    잼과베이컨 2023.07.31 - 17:59 77
    • 1 2 3 4 5 6 7 8 9 .. 10
    • / 10 GO
  • GAMEZONE
 GAMEZONE all rights reserved.
by OrangeDay