SlideShare a Scribd company logo
1 of 60
---------- 1
SPRING-DATA-JPA
초보 입문자용 개인용 정리 튜토리얼
(아라한사의 메모..;;)
https://fb.com/me.adunhansa
https://twitter.com/arahansa
http://adunhansa.tistory.com/
사이트 : http://100coding.com/go
ABOUT
CONTACT
SOURCE
1
1. 작성자 소개 2
아라한사
-------------------------------------------------------------------
평소 정리를 즐겨합니다. 한 때 동영상강좌도
만들다보니.. 비실명과 만화캐릭터를 쓰네요
양해 부탁드립니다 ㅎㅎ
목차 3
• 개요 – 4
• 환경설정 – 6
• 스프링부트 설정 - 14
• 스프링부트헬로월드 – 20
• 하나의 클래스 – 26
• 하나의 클래스 CRUD – 34
• 페이징 처리 – 38
• 일대일관계매핑 – 43
• 일대다매핑 – 47
• 다대다매핑 - 55
-----------------------
개요 4
• 에.. 주로 독학을 하다가, 한계를 느껴서
2015년부터 스터디에 참여을 하게 되었습니다.
김현기님이 운영하시는 TDD,JPA 스터디 , 오창화님이 운영하시는 pooh 스터디 참여중^^;
• 아무래도 다른 개발환경, 다른 경험을 가지신 분들이 오시다보니
스터디에서 쓰게 될 JPA 가 낯설은 분도 계신 것 같기도하고..
• JPA 가 저도 마찬가지로 봐도봐도 아직 낯설어서^^;
정리를 한번 PPT로 해볼려고 합니다.
(제가 정리를 제대로 한 게 없더군요.)
• 일단은 기본 객체매핑과 관계 매핑부터 시작합니다~
간단하고 부족하고 틀린 곳이 있을 지 모릅니다. 주로 제가 혼자 공부하다보니…;;
그리고 심화 정도까지도 안 갑니다;; 항상 급하게 만드느라;;;
아..아무튼~ 자.잘 부탁드립니다! ㄷㄷ
개요2 5
• 아참 김영한님께서 JPA 서적 집필중이시라고 합니다.
그리고 책 중간중간에서 JPA 를 다루는 서적들이 많이
있습니다. (예를 들자면 최범균님의 스프링 같은
책들 말이죠^^)
• 그밖에도 국내에 나온 서적도 몇권 있습니다. ;
기타 링크는 여기에..;
http://opentutorials.org/course/1519
• 본 PPT 는 기초적인 내용을 다룹니다.
환경설정 6
• 음.. 아무래도 손에 익은 툴이 가장 낫겠지요~
• 이클립스를 키고 메이븐을 켜보도록 하겠습니다.
• 컨트롤 N를 눌러주시고 메이븐 프로젝트로
가봅시다
프로젝트 생성 7
• 왠만한 것은 Next를 해주다가, 아래의 창에서 maven-
archetype-webapp 그리고 두번째창에서 아티팩트ID는
마음대로 적어주세요^^
이렇게 에러가 납니다? -> 8
• 대략 이런 화면이 나오는데(하단 우측, 제목 글씨 옆에 이미지 참고해주세요) ,
메이븐에서 갓 구워낸 녀석이 에러를 내는 것이죠~ 일단 에러부터 잡아보도록
하겠습니다. 프로젝트를 우클릭하시면 properties 가 나옵니다. (단축키로
alt+enter를 누르시고)
먼저 project factes 에서 java 버전을 컴퓨터 버전에 맞게(저는 1.8) dynamic
web module 은 3.0 이상으로 맞춰줍니다~
이렇게 에러가 납니다? 9
• 하지만 다음과 같이 에러가 나는 경우가 있습니다
-_-…esc를 눌러주시고 프로젝트를 alt+shift+w 를 눌러주시면 다음과 같은
화면이 뜨는데 네비게이터로 들어가셔서
org.eclipse.common.project.facet.core.xml을 고쳐주도록 합시다.
• 파일 여시면 java 속성과 jst.web 속성이 있습니다.
이부분이 자바버젼과 web모듈 버전이므로 바꿔주시면 됩니다
그래도 에러가 납니다? 10
• 예. 에러가 납니다;; 이번엔 JRE 버전을 바꿔주고
tomcat을 불러와주도록 해야겠습니다. Jre를
먼저 Edit 를 해주시고 1.8 버전으로 바꿔줍시다.
그래도 에러가 납니다? 11
• Jre가 변경이 되었으면 이번엔 server runtime을
추가시켜줍시다. Add library 를 누르시고 server runtime을
추가해주시면 tomcat을 불러와주시면 됩니다. 여기서 자세한
내용은 생략 ^^
일단 프로젝트 기본설정^^; 12
• 일단 깨끗한 프로젝트가 생성이 되었군요.
이걸로 학습을 진행해보도록 하겠습니다^^;
• 원래는 스프링에서 jpa를 쓰려면 설정이 또 복잡한게 많은데.. 본
슬라이드의 목적은 jpa에 익숙해지는 것이므로 spring boot를
이용해서 복잡한 설정은 빼보겠습니다.
아참.. 13
• 아.. 요즘에 gradle, 인텔리J, thymeleaf 에
익숙해지려고 하는데..
• 이상하게 인텔리J에서 spring boot를 적용시켜서
jsp뷰파일을 열 때 404 에러가 납니다.
• 똑같은 프로젝트를 이클립스에서 열면 이클립스에서는
잘 되구요.. 프로젝트의 문제가 아니라 제 인텔리J
문제인것같습니다.
아시는 분은 답변좀 굽신굽신;;
자 이제 Boot 를 적용시켜볼까요? 14
• 자, 모든 소스의 근원은 공홈입니다. 공홈
http://projects.spring.io/spring-boot/ 에서 소스를 한번
받아보겠습니다.
다음의 소스를 pom.xml 에 적어줍시다. (프로젝트 제일 하단 위치)
• 오른쪽 화면같이 잠시 의존성 파일들을 받아주는 시간 걸립니다. 물마시고
오겠습니다.
메이븐이 아파요 15
의존성 파일들을 다 받으면
다음과 같이 에러가 나는 경우
가 있는데, 메이븐설정 pom.xml 가
up-to-date 가 아니니 업데이트
해달라는 말이군요.
프로젝트를 눌러주시고 alt+f5
눌러주시면 말끔해집니다^^
메이븐이 아파요 16
• 가 아니라..다음과 같이 에러가 뜨는 군요;;;
• Facet 설정등을 메이븐에서 적어주지 않았기
때문에 나오는 것같습니다. 메이븐을 업데이트하니
에러가 나는 거군요. Pom.xml 을 다시
설정해줍시다.
메이븐이 아파요 17
• 우선 메이븐 설정에 다음과 같이 메이븐 컴파일러
플러그인을 적용해줍시다. 소스와 타겟속성에 자바버젼을
맞춰줍니다. (아.. 중간에 properties 괜히 넣었군요;;
삽질죄송 ㅋ 이 부분은소스는 이따가 링크 나옵니다~;)
메이븐들이 아파요 18
• 그리고 main/webapp/WEB-INF/web.xml 파일을 보시면
다음과 같이 되어있습니다.
• 예 이것을 기준으로 매번 facet 속성이 초기화되는 것같습니다.
이것도 다음 그림으로 바꿔줍시다.
방긋방긋 프로젝트 19
• 그럼 다음과 같이 이제 프로젝트를 누르고 아무리 alt+f5 메이븐
업데이트를 눌러도 에러가 나지 않습니다.. 고쳐준 것은 pom.xml 과
web.xml 입니다. 소스는 다음과 같습니다.
• Pom.xml
https://github.com/arahansa/learnspringdatajpa/blob/4b1e6238cc6fe6
9e2be1f3c7ef3dc7517db40a08/pom.xml
• Web.xml
• https://github.com/arahansa/learnspringdatajpa/blob/4b1e6238cc6fe69e2b
e1f3c7ef3dc7517db40a08/src/main/webapp/WEB-INF/web.xml
다시 스프링 부트 확인. 20
• 자, 이제 프로젝트가 방긋방긋 어느정도 안심이 되니 스프링부트로 헬로월드부터
띄워놓고 작업해보도록 합니다. 다음과 같이 소스를 적어줍시다.
여기(http://projects.spring.io/spring-boot/) 서 복붙하시면 됩니다.
헬로월드 21
• 다음과 같이 Run- run as- spring boot app 을
눌러줘보도록 하겠습니다. 다음과 같은 헬로월드가
보입니다.
스프링부트의 설정은. 22
• 음 헬로월드가 뜹니다. 참 신기한 세상입니다.
• 어노테이션이 2 개 달리긴 했는데.. 부트에 관한 자세한
설명은 생략하도록 하겠습니다. (어차피 이따가 또
바꿉니다^^)
자, 그 다음으로 해볼일은 Jsp 파일 열어보기! 23
• 여기선 스프링부트의 설정을 약간 다뤄봅니다.
– 우선 보시는 것처럼, java 폴더에서 controller, domain,
repository 패키지를 만들어줍시다.
– 그리고 다음처럼
기존의 sampleController 위에 ComponentScan 을 붙여줘보도록
하겠습니다. Controller 패키지의 컴포넌트들을 읽어보겠단 뜻입니다.
– (나중에 다시 또 바뀝니다.. 제가 중간에 삽질했네요 ㅋㅋ : 미래에서 적은 글)
컨트롤러 패키지 설정과 application.properties 설정 24
• 다음과 같이 controller 설정을 해주도록 하겠습니다. Controller 패키지 안에
넣어줍시다.
• 이렇게 되면 jsp 파일을 연결해줘야 하는데, 다음과 같이 설정해줍니다.
Resources 폴더에 application.properties 란 파일을 만들어줍니다. 이 파일은
부트의 설정들을 적어주는 파일입니다. 보시는 것처럼 spring.view.prefix와
suffix 설정을 잡아주면 webapp폴더를 기준으로 /WEB-INF/jsp/로 들어갑니다.
Jsp파일 위치의 최종 주소는 /WEB-INF/jsp/ 와 컨트롤러에서 적어준 test/test
그리고 suffix 가 들어간 .jsp 가 들어가서
webapp/WEB-INF/jsp/test/test.jsp 가 되게 됩니다 .
Jsp 설정 완료! 25
• 다음과 같은 구조로 설정해주고 boot를 다시 켜보도록
하겠습니다. 처음에 켰던 대로 다시 켜주시고 test 로 접속하시면
hello test 잘 뜹니다^^ (jsp 파일은 대충 만..만드세요 무책임;)
자, 이제 spring-data-jpa 를 들어가볼까요? 26
• 자 먼저 pom.xml 을 다음과 같이 추가해주겠습니다.
• 공홈소스에서 퍼오겠습니다. 밑의 설정들은 data-jpa
와 h2 내장 database를 쓰겠다는 얘기입니다.
• https://spring.io/guides/gs/accessing-data-jpa/
앗 그리고 잠시 리팩토링?^^; 27
• Hello package의 SampleController 가 있습니다. 클래스 상단의 어노테이션을 다음과 같이
바꿔줍시다. ㅠㅠ (삽질 죄송 ㅎ; )
• 패키지를 다음과 같이 바꿔줍시다. ㅠㅠ
• SampleController 가 com.example 에 있고 나머지 controller 와 domain, repository를
com.example 밑에 넣어줍시다.ㅠㅠ (삽질죄송 ㅋ)
DB서버 접속 환경 설정 28
• 메모리 DB를 써보도록 하겠습니다~~ 다음과 같이
spring.datasource로 시작하는 속성들을 설정해주도록 하겠습니다.
• Datasource.url 을 메모리DB로 사용하되, 스프링부트가 띄워진
상태에서 나중에 DB확인을 할수있도록 tcp localhost로 합니다. (공홈
참고함)
소스는 다음과 같습니다.
• https://github.com/arahansa/learnspringdatajpa/blob/f957a2036b2998239ea59d746480e058d3c
5f3ee/src/main/resources/application.properties
Domain 클래스 작성 29
• 다음과 같이 도메인클래스를 만들어 주도록 하겠습니다. 소스는 여기에
있습니다~. 아 이늄은 오른쪽 사진 참고해주세요^^ㅋ 그냥 일단 간단히;;
• https://github.com/arahansa/learnspringdatajpa/blob/58f0305d5a08c94b07a16f74ecf84d34a251
5c33/src/main/java/com/example/domain/JustOne.java
리파지토리 작성 30
• 리파지토리를 작성해보도록 하겠습니다. Spring-data-Jpa의 매직입니다.
이렇게 해주는 것만으로 간단한 CRUD 가 완성이 되었습니다.
신기합니다^^; Data jpa의 repository 인터페이스를 상속하고 있습니다.
이런 계층이 있다는 것만 우선 보고 갑시다.
컨트롤러 작성 31
• 그럼 이제 컨트롤러를 간단히 만들어주도록 하겠습니다.
• https://github.com/arahansa/learnspringdatajpa/blob/58f0305d5a08c94b07a16f7
4ecf84d34a2515c33/src/main/java/com/example/controller/JustOneController.j
ava
• /one 으로 접속했을 때 그냥 db저장만 해두고, “test/test”로 리턴하러 가보겠습니다.
32
• 자 이제, 다시한번 Boot 를 가동시켜보도록 하겠습니다. Localhost:8080/one
으로 접속하면 db 저장 작업이 동작하겠습니다. 하지만 확인을 어떻게 할가요?
여기선 우선 직접 확인해보겠습니다. 이클립스내에는 data source explorer 라는
툴이 있지만, 직접 공홈 홈피에서 h2 를 다운받아 실행해보겠습니다.
다운받아 설치하면 다음과 같은 h2 console
을 실행할 수 있습니다.
내장DB 내용 확인하기 33
• 이제 콘솔로 접속을 하는데, 아까 application.properties 의 주소에
맞춰서 다음과 같이 jdbc url 을 접속해주도록 하겠습니다.
• 음 그럼 저것과 같이 just_one 이 보이는 군요~ 클릭을 해주면 select
문이 완성되고 한번 내용을 봅시다. 음 뭐~~ 예상한 대로 나온
것같습니다. +를 계속 누르셔서 칼럼들이 어떻게 만들어졌는지
확인해봅시다~
테스트 케이스 만들어보기~ 34
• 자 이제 하나의 속성이 어떻게 되가는지 봤으니,
테스트 코드를 작성해서 어떻게 crud 가
동작하는지 알아보도록 하겠습니다
JustoneRepository
를 여시고,
Ctrl+N 하셔서
Test로 검색
Test case 를
만들어보겠습니다
테스트 케이스 만들어보기~ 35
• 아.. 그리고 이런 창(우측상단)이 뜨는 군요~음.. 당장 이걸 누르고
싶은 생각도 있지만 스프링테스트로 한번 작성해보겠습니다~~
그러기 위해선 pom.xml 을 수정해야겠군요~~ 우측하단의
의존성설정을 pom.xml에 넣어줍시다.
테스트 케이스 작성~ 36
• 예. 그러면 다음과 같은 테스트 케이스가 생기며, Junit test case 로
실행시켜주시면 다음과 같이 우선은 실패가 뜰 것입니다. 이제 CRUD 를
만들어볼까요. 우선은 fail 이라는 메소드로 인해 당연히 실패합니다.
CRUD 작성 37
• 다음과 같이 바꿔주고 읽기쓰기삭제수정에 관한 테스트를 작성해줘봅시다~~
자세한 내용은 주석에.. 소스는 여기에.
https://github.com/arahansa/learnspringdatajpa/blob/d4de0b2e2c46f835727e95628cf545d516f097d4/src/test/java/com/
example/repository/JustOneRepositoryTest.java
페이징 처리 1 38
• 자 CRUD 를 해봤으니 이번엔 페이징을 해보도록 하겠습니다.
Pagerequest를 날리는 것이 여기서 핵심인 것같군요. 40개정도
저장해보고 그중에 10개를 뽑아와서 생각한 것을 뽑아왔는지 검사를
해보도록 하겠습니다~
페이징 처리 2 – 정렬 39
• 페이징처리 역순 정렬해봅니다~
특정 메시지로 가져와보기 40
• 이번엔 간단한 검색을 해보도록 하겠습니다. 특정 메시지를 가지고서 찾아보도록 하겠습니다~
JustOneRepository 에 좀 더 적어주면 됩니다
• 객체를 적어주시고 findBy를 하시고 자동완성 기능을 이용하시면 다음과 같이 필드를 자동으로
읽어서 무엇을 선택할지 보여줍니다.
테스트 소스는 여기에 ^^
https://github.com/arahansa/learnspringdatajpa/blob/0c0d1504cd40935d6004ee26e261b6d447baa326/src/test/java/com
/example/repository/JustOneRepositoryTest.java
특정 조건 추가해보기. 41
• http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-
creation
• 이곳을 참고해봅시다. 여기서는 특정날짜 이전, 특정 메시지를 뽑아보도록 하겠습니다.
저렇게 여러가지 조건을 넣어서 리스트로 뽑아줄 수가 있습니다.
• 다음 페이지에 한 페이지로 데이터를 집어넣고 뽑아서 테스트를 해보겠습니다.
(소스가 좀 안 이쁘군요;; 날짜는 보통 joda time 아니면 java8 을 써야한다고
합니다.)
• 소스는 이곳을 참고해보세요~
https://github.com/arahansa/learnspringdatajpa/commit/e4468f0df0c
dc0b97e6656d5bfa22a861c133c99
특정 조건 추가해보기. 42
43
• 1:1 관계매핑부터 시작해보겠습니다.
일단 소스는 여기(하단 링크)를 참고해주세요~
• https://github.com/arahansa/learnspringda
tajpa/commit/43305055e03335f8f1c9c89
227c724546e939ae3
1:1 매핑 44
• 1:1 매핑을 한번 만들어보겠습니다. 가장 간단하게 다음과 같은 구조로 가보겠습니다.
회원이 있고, 회원세부정보를 가지고 있다고 가정합니다. 두 개의 테이블은 1:1
매핑이 되어있습니다. 최종 목적은 이런 화면을 보고 싶은 것입니다. 패키지 구조는
다음과 같이 가져갑시다. (이제부터는 패키지를 테마별로 해서 그 안에 다
집어넣습니다;; 으 애초에 이럴걸 그랬군요;;)
1:1 매핑 클래스 작성 45
• 다음은 1:1 매핑 예제입니다. 양쪽에서 서로의 객체를 필드지정해주면서 @onetoone 어노테이션을
붙여줍시다. @JoinColumn 에서 name 으로 해주면 매핑하는 테이블 외래키의 컬럼명을 지정할
수 있습니다.
Onetoone 매핑으로 상대 테이블의 주키를 외래키로 가져오는 것을 볼수 있습니다.
mappedBy에서상대쪽 필드로 매핑(?) 되어
안기는(?) 것을 볼 수 있습니다.
Cascade란 무엇인고? 46
• 여기서 또 처음 보는 옵션이 나오는데 Cascade 란 것입니다. 이것은 무엇일까요?
저는 왠지 도미노가 떠오릅니다. 소스를 보면서 얘기할까요~ (컨트롤러 주목~)
이런 경우 컨트롤러에서 /member 에 접속하면 Db에 저장을 합니다.
• 저장을 하는 것은 member 만 저장을 하는데, member_detail 테이블도 값이 저장되어있는 것을
보실 수가 있습니다. 이렇게 하게 만들어주는 것이 바로 cascade(우리말로는 작은폭포?) 입니다.
• 매핑이 서로 되어있기 때문에 member에 set설정으로 객체를 지정해주는 것만으로도 연관된
객체들이 DB에 같이 저장이 됩니다. 기본값은 아무 cascade 작업을 안하는 것이고, Member의
cascade설정에는 all 로 되어있으며 cascade 타입엔 여러 속성이 있습니다만 이것은 책이나
API를 참고해주세요 (무책임) Fetchtype은 다음 장 일대다매핑에서 설명해보겠습니다~
일대다 매핑 47
• 일대다인 경우가 어떤 경우가 있을까요. 간단히 생각해보자면, 대학 하나와 학생
여러명이 있는 경우를 생각해보기로 하겠습니다. ㅎㅎ
일인쪽에서는 @OnetoMany 를 여러명인쪽(학생)에서는 @ManyToOne 을
적어주도록 하겠습니다.
• targetEntity 는 Many쪽 해당 클래스를 명시하는 것으로 보여집니다^^;
FetchType은 일단 lazy 모드로 하겠습니다.
• 일대다매핑 총 소스는 여기를 참고해주세요~
(https://github.com/arahansa/learnspringdatajpa/commit/b5266aa4b0
2c5d39a96768b318918eaaff3cbb9e )
일대다매핑 한번 보기 48
• 다음의 리파지토리를 같은 패키지안에 만들고 이제 그럼 컨트롤러 작업을
해보겠습니다. 음.. 사실은 테스트 케이스를 만들어 학습하는게 좋은 것같지만 여기선
컨트롤러를 만들고 직접 한번 어떻게 Fetching 이 이뤄지는지도 한번 보겠습니다.
Student 를 간단하게 만들기 위한 생성자도 만들어줘야겠군요.
컨트롤러의 선언!~ 49
• 음.. 뭐 흐름은 크게 바뀐 것이 없습니다. 학생리스트를 만들어서 University 객체에
set 해주고 저장합니다.
컨트롤러의 선언!~ 50
• application.properties 파일에 다음과 같은 줄을 추가해줍시다.
가동되는 Sql문을 볼 수 있게해줍니다.
• 아 컨트롤러에 이것도 마저 넣어줍시다. 방금 전 경로로 DB세팅을
해놓고서 여기서 불러와보는 것입니다.
일대다매핑 밑작업 51
• 아. University 객체에 이것도 추가해줍시다.
학생들이랑 같이 출력하게 해주는 것입니다. 모든
준비 완료되었습니다~
52
• 자 이제 다시 부트를 가동시키고, 다음주소로 들어가면 이런 화면이 나옵니다. 링크를
눌러서 university check 를 해봅시다. 이클립스 콘솔에서는 다음과 같은 화면이
나옵니다. 저장이 cascade 되어서 student 에 된 것을 볼 수가 있습니다.
• 다음의 경로를 입력하면 그 밑에 이런 sql문이 뜨면서 university 만 가져옵니다.
Student 테이블에는 접근하지 않는 것을 볼 수가 있습니다.
53
• 하지만 이 링크에 접속하면? 짜잔! 다음과 같이 Lazy
loading 에서 Students 리스트를 불러오는 것을 볼 수가
있습니다. 이것이 바로 FetchType.Lazy 모드 덕분입니다.
FetchType 이란 무엇일까요? 54
• 자, 스택오버 플로우의 얘기에서 잠깐 설명하자면
• 대학목록을 불러올 때, 학생들(몇천 몇만 몇십만?) 다 불러올려면 부하가 엄청날 것입니다. 이럴때
좀 느긋하게 레이지 로딩하면 좋다 이겁니다?!(무책임간단한 설명;;) 자세한 것은 책과 공홈 참조
하시면 됩니다;;;; Eager 모드와 Lazy 모드가 있습니다.
• (http://stackoverflow.com/questions/2990799/difference-between-fetchtype-lazy-and-eager-in-java-
persistence)
다대다매핑 55
• 다대다 매핑을 생각해봅시다. 책과 카테고리가 있다고 합시다.
정치,외교/정치일반/정치비평에세이 모두 MB의 비용을 가지고 있다고 하고, 정치비평
카테고리에서는 여러가지책이 있습니다.
• 하나의 책이 여러 카테고리를 가질 수 있고, 하나의 카테고리에서도 여러 책을 가질
수 있습니다. 다대다매핑입니다. (이 예시가 잘 맞을진 모르겠습니다. 지금
새벽3시여서 빨리 마치고 일단 잠이나 자려고요;; 소개되는 API 만
봅시다;;(무책임))..
56
• Book 에서 주키를 뽑아오고, Category에서 주키를 뽑아 이런
테이블이 만들어집니다. 소스는 다음과 같습니다.
https://github.com/arahansa/learnspringdatajpa/comm
it/a1358080790aec3fbc25864b920492ca7ddc7ea8
다대다매핑 57
• Book 클래스와 Category 클래스를 다음과 같이 설정해줘봅시다.
게터세터와 생성자는 생략;; 소스에 나옵니다; ㅎ
• 두 개의 테이블이 참여하여 다른 하나의 테이블을 만들 것입니다.
생성되는 테이블명은 BOOK_CATEGORY 가 될 것이고,
내가 참여하는 쪽에서는 joinColumns 로 우선 주키명을,
상대쪽 테이블은 inverseJoinColumns 로 주키명을 적어줍니다.
일단 이 정도로(?) .. 간결하게 해봅시다.
다대다매핑 설정 58
• 이제 테스트 클래스를 작성하러가봅시다. 흠.. 여기서부터는 메모리 db 가 아니라 로컬에 저장을
하고 한번 보기로 하겠습니다. 다음과 같이 ActiveProfiles 어노테이션을 주고 test모드로
해봅시다.
• 그럼 다음 부분의 application-test.profiles 란 부분의 설정들을 테스트할때 적용하게 됩니다.
다음과 같이 한번 적용해줘봅시다. Ddl-auto 어쩌고 하는 옵션은 하이버네이트가 테이블을
생성하면서 생성만 할 것인지, 생성하고 지울 것인지 하는 옵션입니다. 자세한 것은…역시 API 혹은
책을 참조해주세요^^; server.port는 톰캣이 구동되면..(음 근데 적어줄 필요가 없나?ㅎ;) 가동될
포트번호를 설정하는 것입니다..;
59
• 다음과 같은 사진을 참고해서 정치비평에세이 부문에 책들을
배정해보도록 하겠습니다. 테스트코드를 짜고서 데이터베이스를
직접 확인해보고 싶습니다. 짜고서 돌리면~ 우측 사진같이 배정된
것을 볼 수가 있습니다.
60
THANK YOU !
arahansa
------
------
페북 : https://fb.com/me.adunhansa
트위터 : https://twitter.com/arahansa
블로그: http://adunhansa.tistory.com/
사이트 : http://100coding.com

More Related Content

What's hot

Spring project 예제 분석
Spring project 예제 분석Spring project 예제 분석
Spring project 예제 분석
홍섭 안
 

What's hot (20)

동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO 동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO
 
스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기
 
스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글
 
Go revel 구성_루팅_정리
Go revel 구성_루팅_정리Go revel 구성_루팅_정리
Go revel 구성_루팅_정리
 
Go revel 컨셉_정리
Go revel 컨셉_정리Go revel 컨셉_정리
Go revel 컨셉_정리
 
신림프로그래머 스터디 웹팩 발표자료
신림프로그래머 스터디 웹팩 발표자료신림프로그래머 스터디 웹팩 발표자료
신림프로그래머 스터디 웹팩 발표자료
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기
 
Groovy 시작 입문
Groovy 시작 입문Groovy 시작 입문
Groovy 시작 입문
 
Spring project 예제 분석
Spring project 예제 분석Spring project 예제 분석
Spring project 예제 분석
 
Aws ses 이메일 보내기 받기 송신 수신
Aws ses 이메일 보내기 받기 송신 수신Aws ses 이메일 보내기 받기 송신 수신
Aws ses 이메일 보내기 받기 송신 수신
 
Gulp 입문
Gulp 입문 Gulp 입문
Gulp 입문
 
구글앱엔진+스프링+스프링datajpa+메이븐
구글앱엔진+스프링+스프링datajpa+메이븐구글앱엔진+스프링+스프링datajpa+메이븐
구글앱엔진+스프링+스프링datajpa+메이븐
 
플라스크 템플릿
플라스크 템플릿플라스크 템플릿
플라스크 템플릿
 
Django in Production
Django in ProductionDjango in Production
Django in Production
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
 
[NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기 [NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기
 
휴봇-슬랙 OSX 설치
휴봇-슬랙 OSX 설치휴봇-슬랙 OSX 설치
휴봇-슬랙 OSX 설치
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.
 
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDY
 

Similar to spring data jpa 간단한 튜토리얼

이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
익성 조
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
 
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Programming java day2
Programming java day2Programming java day2
Programming java day2
Jaehoonyam
 
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기
Joongi Kim
 

Similar to spring data jpa 간단한 튜토리얼 (20)

스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기 스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기
 
Spring Boot 1
Spring Boot 1Spring Boot 1
Spring Boot 1
 
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
 
Spring4 + my batis3 + mariadb (maven) 게시판 예제 1
Spring4 + my batis3  + mariadb (maven) 게시판 예제  1Spring4 + my batis3  + mariadb (maven) 게시판 예제  1
Spring4 + my batis3 + mariadb (maven) 게시판 예제 1
 
Cactiez 설치, 백업, 복구
Cactiez 설치, 백업, 복구Cactiez 설치, 백업, 복구
Cactiez 설치, 백업, 복구
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree Algorithm
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
Php
PhpPhp
Php
 
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드
 
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2
 
Place site Design
Place site DesignPlace site Design
Place site Design
 
Programming java day2
Programming java day2Programming java day2
Programming java day2
 
버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제
 
Zeppelin notebook 만들기
Zeppelin notebook 만들기Zeppelin notebook 만들기
Zeppelin notebook 만들기
 
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기
 
OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)
 
Final report201101
Final report201101Final report201101
Final report201101
 
랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial
 

More from 라한사 아 (6)

Slipp 발표 - GO
Slipp 발표 - GOSlipp 발표 - GO
Slipp 발표 - GO
 
Go 페이징게시판만들기
Go 페이징게시판만들기Go 페이징게시판만들기
Go 페이징게시판만들기
 
구글 검색엔진 최적화(Seo) 정리
구글 검색엔진 최적화(Seo) 정리구글 검색엔진 최적화(Seo) 정리
구글 검색엔진 최적화(Seo) 정리
 
프로그래밍 go투어 정리
프로그래밍 go투어 정리프로그래밍 go투어 정리
프로그래밍 go투어 정리
 
개발자를위한 오픈소스라이선스
개발자를위한 오픈소스라이선스개발자를위한 오픈소스라이선스
개발자를위한 오픈소스라이선스
 
자바채팅 다중
자바채팅 다중자바채팅 다중
자바채팅 다중
 

Recently uploaded

Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)
Wonjun Hwang
 
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
Wonjun Hwang
 

Recently uploaded (6)

[OpenLAB] AWS reInvent를 통해 바라본 글로벌 Cloud 기술동향.pdf
[OpenLAB] AWS reInvent를 통해 바라본 글로벌 Cloud 기술동향.pdf[OpenLAB] AWS reInvent를 통해 바라본 글로벌 Cloud 기술동향.pdf
[OpenLAB] AWS reInvent를 통해 바라본 글로벌 Cloud 기술동향.pdf
 
오픈소스 위험 관리 및 공급망 보안 솔루션 'Checkmarx SCA' 소개자료
오픈소스 위험 관리 및 공급망 보안 솔루션 'Checkmarx SCA' 소개자료오픈소스 위험 관리 및 공급망 보안 솔루션 'Checkmarx SCA' 소개자료
오픈소스 위험 관리 및 공급망 보안 솔루션 'Checkmarx SCA' 소개자료
 
Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)
 
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
 
클라우드 애플리케이션 보안 플랫폼 'Checkmarx One' 소개자료
클라우드 애플리케이션 보안 플랫폼 'Checkmarx One' 소개자료클라우드 애플리케이션 보안 플랫폼 'Checkmarx One' 소개자료
클라우드 애플리케이션 보안 플랫폼 'Checkmarx One' 소개자료
 
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
 

spring data jpa 간단한 튜토리얼

  • 1. ---------- 1 SPRING-DATA-JPA 초보 입문자용 개인용 정리 튜토리얼 (아라한사의 메모..;;) https://fb.com/me.adunhansa https://twitter.com/arahansa http://adunhansa.tistory.com/ 사이트 : http://100coding.com/go ABOUT CONTACT SOURCE 1
  • 2. 1. 작성자 소개 2 아라한사 ------------------------------------------------------------------- 평소 정리를 즐겨합니다. 한 때 동영상강좌도 만들다보니.. 비실명과 만화캐릭터를 쓰네요 양해 부탁드립니다 ㅎㅎ
  • 3. 목차 3 • 개요 – 4 • 환경설정 – 6 • 스프링부트 설정 - 14 • 스프링부트헬로월드 – 20 • 하나의 클래스 – 26 • 하나의 클래스 CRUD – 34 • 페이징 처리 – 38 • 일대일관계매핑 – 43 • 일대다매핑 – 47 • 다대다매핑 - 55 -----------------------
  • 4. 개요 4 • 에.. 주로 독학을 하다가, 한계를 느껴서 2015년부터 스터디에 참여을 하게 되었습니다. 김현기님이 운영하시는 TDD,JPA 스터디 , 오창화님이 운영하시는 pooh 스터디 참여중^^; • 아무래도 다른 개발환경, 다른 경험을 가지신 분들이 오시다보니 스터디에서 쓰게 될 JPA 가 낯설은 분도 계신 것 같기도하고.. • JPA 가 저도 마찬가지로 봐도봐도 아직 낯설어서^^; 정리를 한번 PPT로 해볼려고 합니다. (제가 정리를 제대로 한 게 없더군요.) • 일단은 기본 객체매핑과 관계 매핑부터 시작합니다~ 간단하고 부족하고 틀린 곳이 있을 지 모릅니다. 주로 제가 혼자 공부하다보니…;; 그리고 심화 정도까지도 안 갑니다;; 항상 급하게 만드느라;;; 아..아무튼~ 자.잘 부탁드립니다! ㄷㄷ
  • 5. 개요2 5 • 아참 김영한님께서 JPA 서적 집필중이시라고 합니다. 그리고 책 중간중간에서 JPA 를 다루는 서적들이 많이 있습니다. (예를 들자면 최범균님의 스프링 같은 책들 말이죠^^) • 그밖에도 국내에 나온 서적도 몇권 있습니다. ; 기타 링크는 여기에..; http://opentutorials.org/course/1519 • 본 PPT 는 기초적인 내용을 다룹니다.
  • 6. 환경설정 6 • 음.. 아무래도 손에 익은 툴이 가장 낫겠지요~ • 이클립스를 키고 메이븐을 켜보도록 하겠습니다. • 컨트롤 N를 눌러주시고 메이븐 프로젝트로 가봅시다
  • 7. 프로젝트 생성 7 • 왠만한 것은 Next를 해주다가, 아래의 창에서 maven- archetype-webapp 그리고 두번째창에서 아티팩트ID는 마음대로 적어주세요^^
  • 8. 이렇게 에러가 납니다? -> 8 • 대략 이런 화면이 나오는데(하단 우측, 제목 글씨 옆에 이미지 참고해주세요) , 메이븐에서 갓 구워낸 녀석이 에러를 내는 것이죠~ 일단 에러부터 잡아보도록 하겠습니다. 프로젝트를 우클릭하시면 properties 가 나옵니다. (단축키로 alt+enter를 누르시고) 먼저 project factes 에서 java 버전을 컴퓨터 버전에 맞게(저는 1.8) dynamic web module 은 3.0 이상으로 맞춰줍니다~
  • 9. 이렇게 에러가 납니다? 9 • 하지만 다음과 같이 에러가 나는 경우가 있습니다 -_-…esc를 눌러주시고 프로젝트를 alt+shift+w 를 눌러주시면 다음과 같은 화면이 뜨는데 네비게이터로 들어가셔서 org.eclipse.common.project.facet.core.xml을 고쳐주도록 합시다. • 파일 여시면 java 속성과 jst.web 속성이 있습니다. 이부분이 자바버젼과 web모듈 버전이므로 바꿔주시면 됩니다
  • 10. 그래도 에러가 납니다? 10 • 예. 에러가 납니다;; 이번엔 JRE 버전을 바꿔주고 tomcat을 불러와주도록 해야겠습니다. Jre를 먼저 Edit 를 해주시고 1.8 버전으로 바꿔줍시다.
  • 11. 그래도 에러가 납니다? 11 • Jre가 변경이 되었으면 이번엔 server runtime을 추가시켜줍시다. Add library 를 누르시고 server runtime을 추가해주시면 tomcat을 불러와주시면 됩니다. 여기서 자세한 내용은 생략 ^^
  • 12. 일단 프로젝트 기본설정^^; 12 • 일단 깨끗한 프로젝트가 생성이 되었군요. 이걸로 학습을 진행해보도록 하겠습니다^^; • 원래는 스프링에서 jpa를 쓰려면 설정이 또 복잡한게 많은데.. 본 슬라이드의 목적은 jpa에 익숙해지는 것이므로 spring boot를 이용해서 복잡한 설정은 빼보겠습니다.
  • 13. 아참.. 13 • 아.. 요즘에 gradle, 인텔리J, thymeleaf 에 익숙해지려고 하는데.. • 이상하게 인텔리J에서 spring boot를 적용시켜서 jsp뷰파일을 열 때 404 에러가 납니다. • 똑같은 프로젝트를 이클립스에서 열면 이클립스에서는 잘 되구요.. 프로젝트의 문제가 아니라 제 인텔리J 문제인것같습니다. 아시는 분은 답변좀 굽신굽신;;
  • 14. 자 이제 Boot 를 적용시켜볼까요? 14 • 자, 모든 소스의 근원은 공홈입니다. 공홈 http://projects.spring.io/spring-boot/ 에서 소스를 한번 받아보겠습니다. 다음의 소스를 pom.xml 에 적어줍시다. (프로젝트 제일 하단 위치) • 오른쪽 화면같이 잠시 의존성 파일들을 받아주는 시간 걸립니다. 물마시고 오겠습니다.
  • 15. 메이븐이 아파요 15 의존성 파일들을 다 받으면 다음과 같이 에러가 나는 경우 가 있는데, 메이븐설정 pom.xml 가 up-to-date 가 아니니 업데이트 해달라는 말이군요. 프로젝트를 눌러주시고 alt+f5 눌러주시면 말끔해집니다^^
  • 16. 메이븐이 아파요 16 • 가 아니라..다음과 같이 에러가 뜨는 군요;;; • Facet 설정등을 메이븐에서 적어주지 않았기 때문에 나오는 것같습니다. 메이븐을 업데이트하니 에러가 나는 거군요. Pom.xml 을 다시 설정해줍시다.
  • 17. 메이븐이 아파요 17 • 우선 메이븐 설정에 다음과 같이 메이븐 컴파일러 플러그인을 적용해줍시다. 소스와 타겟속성에 자바버젼을 맞춰줍니다. (아.. 중간에 properties 괜히 넣었군요;; 삽질죄송 ㅋ 이 부분은소스는 이따가 링크 나옵니다~;)
  • 18. 메이븐들이 아파요 18 • 그리고 main/webapp/WEB-INF/web.xml 파일을 보시면 다음과 같이 되어있습니다. • 예 이것을 기준으로 매번 facet 속성이 초기화되는 것같습니다. 이것도 다음 그림으로 바꿔줍시다.
  • 19. 방긋방긋 프로젝트 19 • 그럼 다음과 같이 이제 프로젝트를 누르고 아무리 alt+f5 메이븐 업데이트를 눌러도 에러가 나지 않습니다.. 고쳐준 것은 pom.xml 과 web.xml 입니다. 소스는 다음과 같습니다. • Pom.xml https://github.com/arahansa/learnspringdatajpa/blob/4b1e6238cc6fe6 9e2be1f3c7ef3dc7517db40a08/pom.xml • Web.xml • https://github.com/arahansa/learnspringdatajpa/blob/4b1e6238cc6fe69e2b e1f3c7ef3dc7517db40a08/src/main/webapp/WEB-INF/web.xml
  • 20. 다시 스프링 부트 확인. 20 • 자, 이제 프로젝트가 방긋방긋 어느정도 안심이 되니 스프링부트로 헬로월드부터 띄워놓고 작업해보도록 합니다. 다음과 같이 소스를 적어줍시다. 여기(http://projects.spring.io/spring-boot/) 서 복붙하시면 됩니다.
  • 21. 헬로월드 21 • 다음과 같이 Run- run as- spring boot app 을 눌러줘보도록 하겠습니다. 다음과 같은 헬로월드가 보입니다.
  • 22. 스프링부트의 설정은. 22 • 음 헬로월드가 뜹니다. 참 신기한 세상입니다. • 어노테이션이 2 개 달리긴 했는데.. 부트에 관한 자세한 설명은 생략하도록 하겠습니다. (어차피 이따가 또 바꿉니다^^)
  • 23. 자, 그 다음으로 해볼일은 Jsp 파일 열어보기! 23 • 여기선 스프링부트의 설정을 약간 다뤄봅니다. – 우선 보시는 것처럼, java 폴더에서 controller, domain, repository 패키지를 만들어줍시다. – 그리고 다음처럼 기존의 sampleController 위에 ComponentScan 을 붙여줘보도록 하겠습니다. Controller 패키지의 컴포넌트들을 읽어보겠단 뜻입니다. – (나중에 다시 또 바뀝니다.. 제가 중간에 삽질했네요 ㅋㅋ : 미래에서 적은 글)
  • 24. 컨트롤러 패키지 설정과 application.properties 설정 24 • 다음과 같이 controller 설정을 해주도록 하겠습니다. Controller 패키지 안에 넣어줍시다. • 이렇게 되면 jsp 파일을 연결해줘야 하는데, 다음과 같이 설정해줍니다. Resources 폴더에 application.properties 란 파일을 만들어줍니다. 이 파일은 부트의 설정들을 적어주는 파일입니다. 보시는 것처럼 spring.view.prefix와 suffix 설정을 잡아주면 webapp폴더를 기준으로 /WEB-INF/jsp/로 들어갑니다. Jsp파일 위치의 최종 주소는 /WEB-INF/jsp/ 와 컨트롤러에서 적어준 test/test 그리고 suffix 가 들어간 .jsp 가 들어가서 webapp/WEB-INF/jsp/test/test.jsp 가 되게 됩니다 .
  • 25. Jsp 설정 완료! 25 • 다음과 같은 구조로 설정해주고 boot를 다시 켜보도록 하겠습니다. 처음에 켰던 대로 다시 켜주시고 test 로 접속하시면 hello test 잘 뜹니다^^ (jsp 파일은 대충 만..만드세요 무책임;)
  • 26. 자, 이제 spring-data-jpa 를 들어가볼까요? 26 • 자 먼저 pom.xml 을 다음과 같이 추가해주겠습니다. • 공홈소스에서 퍼오겠습니다. 밑의 설정들은 data-jpa 와 h2 내장 database를 쓰겠다는 얘기입니다. • https://spring.io/guides/gs/accessing-data-jpa/
  • 27. 앗 그리고 잠시 리팩토링?^^; 27 • Hello package의 SampleController 가 있습니다. 클래스 상단의 어노테이션을 다음과 같이 바꿔줍시다. ㅠㅠ (삽질 죄송 ㅎ; ) • 패키지를 다음과 같이 바꿔줍시다. ㅠㅠ • SampleController 가 com.example 에 있고 나머지 controller 와 domain, repository를 com.example 밑에 넣어줍시다.ㅠㅠ (삽질죄송 ㅋ)
  • 28. DB서버 접속 환경 설정 28 • 메모리 DB를 써보도록 하겠습니다~~ 다음과 같이 spring.datasource로 시작하는 속성들을 설정해주도록 하겠습니다. • Datasource.url 을 메모리DB로 사용하되, 스프링부트가 띄워진 상태에서 나중에 DB확인을 할수있도록 tcp localhost로 합니다. (공홈 참고함) 소스는 다음과 같습니다. • https://github.com/arahansa/learnspringdatajpa/blob/f957a2036b2998239ea59d746480e058d3c 5f3ee/src/main/resources/application.properties
  • 29. Domain 클래스 작성 29 • 다음과 같이 도메인클래스를 만들어 주도록 하겠습니다. 소스는 여기에 있습니다~. 아 이늄은 오른쪽 사진 참고해주세요^^ㅋ 그냥 일단 간단히;; • https://github.com/arahansa/learnspringdatajpa/blob/58f0305d5a08c94b07a16f74ecf84d34a251 5c33/src/main/java/com/example/domain/JustOne.java
  • 30. 리파지토리 작성 30 • 리파지토리를 작성해보도록 하겠습니다. Spring-data-Jpa의 매직입니다. 이렇게 해주는 것만으로 간단한 CRUD 가 완성이 되었습니다. 신기합니다^^; Data jpa의 repository 인터페이스를 상속하고 있습니다. 이런 계층이 있다는 것만 우선 보고 갑시다.
  • 31. 컨트롤러 작성 31 • 그럼 이제 컨트롤러를 간단히 만들어주도록 하겠습니다. • https://github.com/arahansa/learnspringdatajpa/blob/58f0305d5a08c94b07a16f7 4ecf84d34a2515c33/src/main/java/com/example/controller/JustOneController.j ava • /one 으로 접속했을 때 그냥 db저장만 해두고, “test/test”로 리턴하러 가보겠습니다.
  • 32. 32 • 자 이제, 다시한번 Boot 를 가동시켜보도록 하겠습니다. Localhost:8080/one 으로 접속하면 db 저장 작업이 동작하겠습니다. 하지만 확인을 어떻게 할가요? 여기선 우선 직접 확인해보겠습니다. 이클립스내에는 data source explorer 라는 툴이 있지만, 직접 공홈 홈피에서 h2 를 다운받아 실행해보겠습니다. 다운받아 설치하면 다음과 같은 h2 console 을 실행할 수 있습니다.
  • 33. 내장DB 내용 확인하기 33 • 이제 콘솔로 접속을 하는데, 아까 application.properties 의 주소에 맞춰서 다음과 같이 jdbc url 을 접속해주도록 하겠습니다. • 음 그럼 저것과 같이 just_one 이 보이는 군요~ 클릭을 해주면 select 문이 완성되고 한번 내용을 봅시다. 음 뭐~~ 예상한 대로 나온 것같습니다. +를 계속 누르셔서 칼럼들이 어떻게 만들어졌는지 확인해봅시다~
  • 34. 테스트 케이스 만들어보기~ 34 • 자 이제 하나의 속성이 어떻게 되가는지 봤으니, 테스트 코드를 작성해서 어떻게 crud 가 동작하는지 알아보도록 하겠습니다 JustoneRepository 를 여시고, Ctrl+N 하셔서 Test로 검색 Test case 를 만들어보겠습니다
  • 35. 테스트 케이스 만들어보기~ 35 • 아.. 그리고 이런 창(우측상단)이 뜨는 군요~음.. 당장 이걸 누르고 싶은 생각도 있지만 스프링테스트로 한번 작성해보겠습니다~~ 그러기 위해선 pom.xml 을 수정해야겠군요~~ 우측하단의 의존성설정을 pom.xml에 넣어줍시다.
  • 36. 테스트 케이스 작성~ 36 • 예. 그러면 다음과 같은 테스트 케이스가 생기며, Junit test case 로 실행시켜주시면 다음과 같이 우선은 실패가 뜰 것입니다. 이제 CRUD 를 만들어볼까요. 우선은 fail 이라는 메소드로 인해 당연히 실패합니다.
  • 37. CRUD 작성 37 • 다음과 같이 바꿔주고 읽기쓰기삭제수정에 관한 테스트를 작성해줘봅시다~~ 자세한 내용은 주석에.. 소스는 여기에. https://github.com/arahansa/learnspringdatajpa/blob/d4de0b2e2c46f835727e95628cf545d516f097d4/src/test/java/com/ example/repository/JustOneRepositoryTest.java
  • 38. 페이징 처리 1 38 • 자 CRUD 를 해봤으니 이번엔 페이징을 해보도록 하겠습니다. Pagerequest를 날리는 것이 여기서 핵심인 것같군요. 40개정도 저장해보고 그중에 10개를 뽑아와서 생각한 것을 뽑아왔는지 검사를 해보도록 하겠습니다~
  • 39. 페이징 처리 2 – 정렬 39 • 페이징처리 역순 정렬해봅니다~
  • 40. 특정 메시지로 가져와보기 40 • 이번엔 간단한 검색을 해보도록 하겠습니다. 특정 메시지를 가지고서 찾아보도록 하겠습니다~ JustOneRepository 에 좀 더 적어주면 됩니다 • 객체를 적어주시고 findBy를 하시고 자동완성 기능을 이용하시면 다음과 같이 필드를 자동으로 읽어서 무엇을 선택할지 보여줍니다. 테스트 소스는 여기에 ^^ https://github.com/arahansa/learnspringdatajpa/blob/0c0d1504cd40935d6004ee26e261b6d447baa326/src/test/java/com /example/repository/JustOneRepositoryTest.java
  • 41. 특정 조건 추가해보기. 41 • http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query- creation • 이곳을 참고해봅시다. 여기서는 특정날짜 이전, 특정 메시지를 뽑아보도록 하겠습니다. 저렇게 여러가지 조건을 넣어서 리스트로 뽑아줄 수가 있습니다. • 다음 페이지에 한 페이지로 데이터를 집어넣고 뽑아서 테스트를 해보겠습니다. (소스가 좀 안 이쁘군요;; 날짜는 보통 joda time 아니면 java8 을 써야한다고 합니다.) • 소스는 이곳을 참고해보세요~ https://github.com/arahansa/learnspringdatajpa/commit/e4468f0df0c dc0b97e6656d5bfa22a861c133c99
  • 43. 43 • 1:1 관계매핑부터 시작해보겠습니다. 일단 소스는 여기(하단 링크)를 참고해주세요~ • https://github.com/arahansa/learnspringda tajpa/commit/43305055e03335f8f1c9c89 227c724546e939ae3
  • 44. 1:1 매핑 44 • 1:1 매핑을 한번 만들어보겠습니다. 가장 간단하게 다음과 같은 구조로 가보겠습니다. 회원이 있고, 회원세부정보를 가지고 있다고 가정합니다. 두 개의 테이블은 1:1 매핑이 되어있습니다. 최종 목적은 이런 화면을 보고 싶은 것입니다. 패키지 구조는 다음과 같이 가져갑시다. (이제부터는 패키지를 테마별로 해서 그 안에 다 집어넣습니다;; 으 애초에 이럴걸 그랬군요;;)
  • 45. 1:1 매핑 클래스 작성 45 • 다음은 1:1 매핑 예제입니다. 양쪽에서 서로의 객체를 필드지정해주면서 @onetoone 어노테이션을 붙여줍시다. @JoinColumn 에서 name 으로 해주면 매핑하는 테이블 외래키의 컬럼명을 지정할 수 있습니다. Onetoone 매핑으로 상대 테이블의 주키를 외래키로 가져오는 것을 볼수 있습니다. mappedBy에서상대쪽 필드로 매핑(?) 되어 안기는(?) 것을 볼 수 있습니다.
  • 46. Cascade란 무엇인고? 46 • 여기서 또 처음 보는 옵션이 나오는데 Cascade 란 것입니다. 이것은 무엇일까요? 저는 왠지 도미노가 떠오릅니다. 소스를 보면서 얘기할까요~ (컨트롤러 주목~) 이런 경우 컨트롤러에서 /member 에 접속하면 Db에 저장을 합니다. • 저장을 하는 것은 member 만 저장을 하는데, member_detail 테이블도 값이 저장되어있는 것을 보실 수가 있습니다. 이렇게 하게 만들어주는 것이 바로 cascade(우리말로는 작은폭포?) 입니다. • 매핑이 서로 되어있기 때문에 member에 set설정으로 객체를 지정해주는 것만으로도 연관된 객체들이 DB에 같이 저장이 됩니다. 기본값은 아무 cascade 작업을 안하는 것이고, Member의 cascade설정에는 all 로 되어있으며 cascade 타입엔 여러 속성이 있습니다만 이것은 책이나 API를 참고해주세요 (무책임) Fetchtype은 다음 장 일대다매핑에서 설명해보겠습니다~
  • 47. 일대다 매핑 47 • 일대다인 경우가 어떤 경우가 있을까요. 간단히 생각해보자면, 대학 하나와 학생 여러명이 있는 경우를 생각해보기로 하겠습니다. ㅎㅎ 일인쪽에서는 @OnetoMany 를 여러명인쪽(학생)에서는 @ManyToOne 을 적어주도록 하겠습니다. • targetEntity 는 Many쪽 해당 클래스를 명시하는 것으로 보여집니다^^; FetchType은 일단 lazy 모드로 하겠습니다. • 일대다매핑 총 소스는 여기를 참고해주세요~ (https://github.com/arahansa/learnspringdatajpa/commit/b5266aa4b0 2c5d39a96768b318918eaaff3cbb9e )
  • 48. 일대다매핑 한번 보기 48 • 다음의 리파지토리를 같은 패키지안에 만들고 이제 그럼 컨트롤러 작업을 해보겠습니다. 음.. 사실은 테스트 케이스를 만들어 학습하는게 좋은 것같지만 여기선 컨트롤러를 만들고 직접 한번 어떻게 Fetching 이 이뤄지는지도 한번 보겠습니다. Student 를 간단하게 만들기 위한 생성자도 만들어줘야겠군요.
  • 49. 컨트롤러의 선언!~ 49 • 음.. 뭐 흐름은 크게 바뀐 것이 없습니다. 학생리스트를 만들어서 University 객체에 set 해주고 저장합니다.
  • 50. 컨트롤러의 선언!~ 50 • application.properties 파일에 다음과 같은 줄을 추가해줍시다. 가동되는 Sql문을 볼 수 있게해줍니다. • 아 컨트롤러에 이것도 마저 넣어줍시다. 방금 전 경로로 DB세팅을 해놓고서 여기서 불러와보는 것입니다.
  • 51. 일대다매핑 밑작업 51 • 아. University 객체에 이것도 추가해줍시다. 학생들이랑 같이 출력하게 해주는 것입니다. 모든 준비 완료되었습니다~
  • 52. 52 • 자 이제 다시 부트를 가동시키고, 다음주소로 들어가면 이런 화면이 나옵니다. 링크를 눌러서 university check 를 해봅시다. 이클립스 콘솔에서는 다음과 같은 화면이 나옵니다. 저장이 cascade 되어서 student 에 된 것을 볼 수가 있습니다. • 다음의 경로를 입력하면 그 밑에 이런 sql문이 뜨면서 university 만 가져옵니다. Student 테이블에는 접근하지 않는 것을 볼 수가 있습니다.
  • 53. 53 • 하지만 이 링크에 접속하면? 짜잔! 다음과 같이 Lazy loading 에서 Students 리스트를 불러오는 것을 볼 수가 있습니다. 이것이 바로 FetchType.Lazy 모드 덕분입니다.
  • 54. FetchType 이란 무엇일까요? 54 • 자, 스택오버 플로우의 얘기에서 잠깐 설명하자면 • 대학목록을 불러올 때, 학생들(몇천 몇만 몇십만?) 다 불러올려면 부하가 엄청날 것입니다. 이럴때 좀 느긋하게 레이지 로딩하면 좋다 이겁니다?!(무책임간단한 설명;;) 자세한 것은 책과 공홈 참조 하시면 됩니다;;;; Eager 모드와 Lazy 모드가 있습니다. • (http://stackoverflow.com/questions/2990799/difference-between-fetchtype-lazy-and-eager-in-java- persistence)
  • 55. 다대다매핑 55 • 다대다 매핑을 생각해봅시다. 책과 카테고리가 있다고 합시다. 정치,외교/정치일반/정치비평에세이 모두 MB의 비용을 가지고 있다고 하고, 정치비평 카테고리에서는 여러가지책이 있습니다. • 하나의 책이 여러 카테고리를 가질 수 있고, 하나의 카테고리에서도 여러 책을 가질 수 있습니다. 다대다매핑입니다. (이 예시가 잘 맞을진 모르겠습니다. 지금 새벽3시여서 빨리 마치고 일단 잠이나 자려고요;; 소개되는 API 만 봅시다;;(무책임))..
  • 56. 56 • Book 에서 주키를 뽑아오고, Category에서 주키를 뽑아 이런 테이블이 만들어집니다. 소스는 다음과 같습니다. https://github.com/arahansa/learnspringdatajpa/comm it/a1358080790aec3fbc25864b920492ca7ddc7ea8
  • 57. 다대다매핑 57 • Book 클래스와 Category 클래스를 다음과 같이 설정해줘봅시다. 게터세터와 생성자는 생략;; 소스에 나옵니다; ㅎ • 두 개의 테이블이 참여하여 다른 하나의 테이블을 만들 것입니다. 생성되는 테이블명은 BOOK_CATEGORY 가 될 것이고, 내가 참여하는 쪽에서는 joinColumns 로 우선 주키명을, 상대쪽 테이블은 inverseJoinColumns 로 주키명을 적어줍니다. 일단 이 정도로(?) .. 간결하게 해봅시다.
  • 58. 다대다매핑 설정 58 • 이제 테스트 클래스를 작성하러가봅시다. 흠.. 여기서부터는 메모리 db 가 아니라 로컬에 저장을 하고 한번 보기로 하겠습니다. 다음과 같이 ActiveProfiles 어노테이션을 주고 test모드로 해봅시다. • 그럼 다음 부분의 application-test.profiles 란 부분의 설정들을 테스트할때 적용하게 됩니다. 다음과 같이 한번 적용해줘봅시다. Ddl-auto 어쩌고 하는 옵션은 하이버네이트가 테이블을 생성하면서 생성만 할 것인지, 생성하고 지울 것인지 하는 옵션입니다. 자세한 것은…역시 API 혹은 책을 참조해주세요^^; server.port는 톰캣이 구동되면..(음 근데 적어줄 필요가 없나?ㅎ;) 가동될 포트번호를 설정하는 것입니다..;
  • 59. 59 • 다음과 같은 사진을 참고해서 정치비평에세이 부문에 책들을 배정해보도록 하겠습니다. 테스트코드를 짜고서 데이터베이스를 직접 확인해보고 싶습니다. 짜고서 돌리면~ 우측 사진같이 배정된 것을 볼 수가 있습니다.
  • 60. 60 THANK YOU ! arahansa ------ ------ 페북 : https://fb.com/me.adunhansa 트위터 : https://twitter.com/arahansa 블로그: http://adunhansa.tistory.com/ 사이트 : http://100coding.com