SlideShare a Scribd company logo
Booting Spring Data REST
์ด๊ฒฝ์›(woniper)
leekw3747@gmail.com
http://blog.woniper.net
๏ฌ REST API
๏ฌ Spring Web MVC
๏ฌ Spring Data JPA ๋˜๋Š” Java ORM
๏ฌ ๋ฅผ ์‚ฌ์šฉํ•ด ๋ดค๊ฑฐ๋‚˜, ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
Modern Application
๋‹ค์–‘ํ•œ Client ๋“ฑ์žฅ
Client To Server
Server To Server
๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค REST
API
Spring Data REST
REST API๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ 
๏ฌ Repository ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋งŒ์œผ๋กœ REST API ์ œ๊ณต
ํŠน์ง•
๏ฌ Repository ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋งŒ์œผ๋กœ REST API ์ œ๊ณต
๏ฌ Query Method : ๋ฉ”์†Œ๋“œ ์„ ์–ธ์œผ๋กœ ๊ฒ€์ƒ‰ API ์ง€์›
ํŠน์ง•
๏ฌ Repository ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋งŒ์œผ๋กœ REST API ์ œ๊ณต
๏ฌ Query Method : ๋ฉ”์†Œ๋“œ ์„ ์–ธ์œผ๋กœ ๊ฒ€์ƒ‰ API ์ง€์›
๏ฌ Projection : ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ๋ฐฉ์‹์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ •์˜/ํ‘œํ˜„ ๊ฐ€๋Šฅ
ํŠน์ง•
๏ฌ Repository ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋งŒ์œผ๋กœ REST API ์ œ๊ณต
๏ฌ Query Method : ๋ฉ”์†Œ๋“œ ์„ ์–ธ์œผ๋กœ ๊ฒ€์ƒ‰ API ์ง€์›
๏ฌ Projection : ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ๋ฐฉ์‹์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ •์˜/ํ‘œํ˜„ ๊ฐ€๋Šฅ
๏ฌ HATEOAS : MetaData ํ‘œํ˜„ (Model, Link, Resource)
ํŠน์ง•
Spring Data
Spring Data REST
Spring Data REST
๊ฒŒ์‹œํŒ์„ ๋งŒ๋“ค์–ด ๋ณผ๊นŒ์š”?
ํšŒ์›๋งŒ
๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ์ด
๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
@Entity
public class Board {
@Id @GeneratedValue
private Long boardId;
@Embedded
private Contents contents;
@ManyToOne(optional = false) // ๋งคํ•‘ ํ•„์ˆ˜
private Member member;
}
@Embeddable
public class Contents {
@Column(name = "title", nullable = false)
private String title; // ์ œ๋ชฉ
@Lob
@Column(name = "body", nullable = false)
private String body; // ๋ณธ๋ฌธ ๋‚ด์šฉ
}
@Entity
public class Member {
@Id @GeneratedValue
private Long memberId;
@Column(name = "username", unique = true, nullable = false)
private String username;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@OneToMany(cascade = CascadeType.ALL)
private List<Board> boards = new ArrayList<>();
}
Spring MVC
@Controller
@RequestMapping("/boards")
public class BoardController {
@ResponseBody // ์ƒ์„ฑ
@RequestMapping(method = RequestMethod.POST)
public Board post(@RequestBody Board board) {};
@ResponseBody // ์กฐํšŒ
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Board get(@PathVariable("id") Long boardId) {};
@ResponseBody // ์ˆ˜์ •
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public Board put(@PathVariable("id") Long boardId,
@RequestBody Contents contents) {};
@ResponseBody // ์‚ญ์ œ
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public void post(@PathVariable("id") Long boardId) {};
}
Controller
@Service
@Transactional
public class BoardService {
public Board new(Board board){}; // ์ƒ์„ฑ
public Board get(Long boardId){}; // ์กฐํšŒ
public Board update(Board board){}; // ์ˆ˜์ •
public void remove(Long boardId){}; // ์‚ญ์ œ
}
Service
@Repository
interface BoardRepository
extends CrudRepository<Board, Long> {
Board save(Board board); // insert, update
Board findOne(Long boardId); // select
void delete(Long boardId); // delete
}
Repository
๋ฐ˜๋ณต๋˜๊ณ 
๋‹จ์ˆœํ•œ ์ฝ”๋“œ
์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ํ•  ๊ฒƒ.
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {}
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {}
๋‚˜๋Š” REST API ์ž…๋‹ˆ๋‹ค.
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {}
/{entity}s/{id}
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {}
/boards/1
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {}
๋ฉ”์†Œ๋“œ๊ฐ€ ๊ณง API
POST : /boards
PUT | PATCH : /boards/{id}
GET : /boards/{id}
POST : /boards
PUT | PATCH : /boards/{id}
GET : /boards/{id}
POST : /boards
PUT | PATCH : /boards/{id}
GET : /boards
GET : /boards/{id}
POST : /boards
PUT | PATCH : /boards/{id}
DELETE : /boards/{id}
GET : /boards
๊ฒ€์ƒ‰ API๋„ ๋งŒ๋“ค๊ณ  ์‹ถ์–ด์š”.
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
}
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
}
/boards/search/starts-title
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
} ?title={}
/boards/search/starts-title
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
}
์ œ๋ชฉ์ด h๋กœ ์‹œ์ž‘ํ•˜๋Š”
๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์‹ถ์–ด์š”.
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
} /boards/search/starts-title?title=h
์ œ๋ชฉ์ด h๋กœ ์‹œ์ž‘ํ•˜๋Š”
๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์‹ถ์–ด์š”.
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
}
SELECT *
FROM board
WHERE title LIKE h%
LiveCoding!?
์žฅ์ 
๏ฌ ๋น ๋ฅด๊ฒŒ REST API ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ
๏ฌ ํ™•์žฅ์ด ์‰ฝ๋‹ค.
๏ฌ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— ์„ค์ • ๊ฐ€๋Šฅ. (Spring Data ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ
์šฐ)
๋ณด์ด๋Š”๊ฒŒ ๋‹ค๊ฐ€ ์•„๋‹ˆ๋‹ค.
REST API
DDD
(ORM + Database)
Spring
WEB
DATA
DATA REST
์ ์šฉ!!!
์ ์šฉ!!!
์˜์กด์„ฑ์ด ๋‚ฎ์€ ๋„๋ฉ”์ธ
์ ์šฉ!!!
์˜์กด์„ฑ์ด ๋‚ฎ์€ ๋„๋ฉ”์ธ
์‚ฌ๋‚ด ์‹œ์Šคํ…œ
์ ์šฉ!!!
์˜์กด์„ฑ์ด ๋‚ฎ์€ ๋„๋ฉ”์ธ
์‚ฌ๋‚ด ์‹œ์Šคํ…œ
์กฐํšŒ๋งŒ ์ ์šฉ
๋—.

More Related Content

Similar to Booting Spring Data REST

Ksug ์„ธ๋ฏธ๋‚˜ (์œค์„ฑ์ค€) (20121208)
Ksug ์„ธ๋ฏธ๋‚˜ (์œค์„ฑ์ค€) (20121208)Ksug ์„ธ๋ฏธ๋‚˜ (์œค์„ฑ์ค€) (20121208)
Ksug ์„ธ๋ฏธ๋‚˜ (์œค์„ฑ์ค€) (20121208)Sungjoon Yoon
ย 
Srping data rest
Srping data restSrping data rest
Srping data rest
ChangHyeon Bae
ย 
[TECHCON 2019: MOBILE - Android]2.์˜ˆ์ œ์—์„œ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” Model ์ด์•ผ๊ธฐ
[TECHCON 2019: MOBILE - Android]2.์˜ˆ์ œ์—์„œ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” Model ์ด์•ผ๊ธฐ[TECHCON 2019: MOBILE - Android]2.์˜ˆ์ œ์—์„œ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” Model ์ด์•ผ๊ธฐ
[TECHCON 2019: MOBILE - Android]2.์˜ˆ์ œ์—์„œ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” Model ์ด์•ผ๊ธฐ
NAVER Engineering
ย 
REST Ovewview
REST OvewviewREST Ovewview
REST Ovewview
Terry Cho
ย 
ํŒŒ์ด์ฌ ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ 2ํƒ„
ํŒŒ์ด์ฌ ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ 2ํƒ„ ํŒŒ์ด์ฌ ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ 2ํƒ„
ํŒŒ์ด์ฌ ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ 2ํƒ„
SeongHyun Ahn
ย 
ASP.NET Web API๋ฅผ ํ™œ์šฉํ•œ RESTful ์„œ๋น„์Šค ๊ฐœ๋ฐœ
ASP.NET Web API๋ฅผ ํ™œ์šฉํ•œ RESTful ์„œ๋น„์Šค ๊ฐœ๋ฐœASP.NET Web API๋ฅผ ํ™œ์šฉํ•œ RESTful ์„œ๋น„์Šค ๊ฐœ๋ฐœ
ASP.NET Web API๋ฅผ ํ™œ์šฉํ•œ RESTful ์„œ๋น„์Šค ๊ฐœ๋ฐœ
SangHoon Han
ย 
์ œ 4ํšŒ DGMIT R&D ์ปจํผ๋Ÿฐ์Šค : REST API - ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ์  ์•„ํ‚คํ…์ฒ˜
์ œ 4ํšŒ DGMIT R&D ์ปจํผ๋Ÿฐ์Šค : REST API - ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ์  ์•„ํ‚คํ…์ฒ˜์ œ 4ํšŒ DGMIT R&D ์ปจํผ๋Ÿฐ์Šค : REST API - ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ์  ์•„ํ‚คํ…์ฒ˜
์ œ 4ํšŒ DGMIT R&D ์ปจํผ๋Ÿฐ์Šค : REST API - ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ์  ์•„ํ‚คํ…์ฒ˜
dgmit2009
ย 
ASP.NET Web API๋ฅผ ์ด์šฉํ•œ ์˜คํ”ˆ API ๊ฐœ๋ฐœ
ASP.NET Web API๋ฅผ ์ด์šฉํ•œ ์˜คํ”ˆ API ๊ฐœ๋ฐœASP.NET Web API๋ฅผ ์ด์šฉํ•œ ์˜คํ”ˆ API ๊ฐœ๋ฐœ
ASP.NET Web API๋ฅผ ์ด์šฉํ•œ ์˜คํ”ˆ API ๊ฐœ๋ฐœ
SangHoon Han
ย 
GKAC 2015 Apr. - Battery, ์•ˆ๋“œ๋กœ์ด๋“œ๋ฅผ ์œ„ํ•œ ์‰ฌ์šด ์›น API ํ˜ธ์ถœ
GKAC 2015 Apr. - Battery, ์•ˆ๋“œ๋กœ์ด๋“œ๋ฅผ ์œ„ํ•œ ์‰ฌ์šด ์›น API ํ˜ธ์ถœGKAC 2015 Apr. - Battery, ์•ˆ๋“œ๋กœ์ด๋“œ๋ฅผ ์œ„ํ•œ ์‰ฌ์šด ์›น API ํ˜ธ์ถœ
GKAC 2015 Apr. - Battery, ์•ˆ๋“œ๋กœ์ด๋“œ๋ฅผ ์œ„ํ•œ ์‰ฌ์šด ์›น API ํ˜ธ์ถœ
GDG Korea
ย 
overview of spring4
overview of spring4overview of spring4
overview of spring4
Arawn Park
ย 
2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCamp2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCamp
Jeikei Park
ย 
REST API ์„ค๊ณ„
REST API ์„ค๊ณ„REST API ์„ค๊ณ„
REST API ์„ค๊ณ„
Terry Cho
ย 
Restful ์ œ๋Œ€๋กœ ์•Œ๊ธฐ(Getting to know the RESTful)
Restful ์ œ๋Œ€๋กœ ์•Œ๊ธฐ(Getting to know the RESTful)Restful ์ œ๋Œ€๋กœ ์•Œ๊ธฐ(Getting to know the RESTful)
Restful ์ œ๋Œ€๋กœ ์•Œ๊ธฐ(Getting to know the RESTful)
๊ด‘ํฌ ์กฐ
ย 
GraphQL overview #2
GraphQL overview #2GraphQL overview #2
GraphQL overview #2
๊ธฐ๋™ ์ด
ย 
๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ์‹ซ์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ
๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ์‹ซ์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ์‹ซ์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ
๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ์‹ซ์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ
Sungju Jin
ย 
[112]restแ„‹แ…ฆแ„‰แ…ฅ graph qlแ„€แ…ช relayแ„…แ…ฉ แ„€แ…กแ†ฏแ„‹แ…กแ„แ…กแ„€แ…ต แ„‹แ…ตแ„Œแ…ฅแ†ผแ„‹แ…ฎ
[112]restแ„‹แ…ฆแ„‰แ…ฅ graph qlแ„€แ…ช relayแ„…แ…ฉ แ„€แ…กแ†ฏแ„‹แ…กแ„แ…กแ„€แ…ต แ„‹แ…ตแ„Œแ…ฅแ†ผแ„‹แ…ฎ[112]restแ„‹แ…ฆแ„‰แ…ฅ graph qlแ„€แ…ช relayแ„…แ…ฉ แ„€แ…กแ†ฏแ„‹แ…กแ„แ…กแ„€แ…ต แ„‹แ…ตแ„Œแ…ฅแ†ผแ„‹แ…ฎ
[112]restแ„‹แ…ฆแ„‰แ…ฅ graph qlแ„€แ…ช relayแ„…แ…ฉ แ„€แ…กแ†ฏแ„‹แ…กแ„แ…กแ„€แ…ต แ„‹แ…ตแ„Œแ…ฅแ†ผแ„‹แ…ฎ
NAVER D2
ย 
Webrtc ํ—ˆ์˜๋‚จ 20150528
Webrtc ํ—ˆ์˜๋‚จ 20150528Webrtc ํ—ˆ์˜๋‚จ 20150528
Webrtc ํ—ˆ์˜๋‚จ 20150528
์˜๋‚จ ํ—ˆ
ย 
Do IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open API
Do IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open APIDo IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open API
Do IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open API
Hyunghun Cho
ย 
Express framework tutorial
Express framework tutorialExpress framework tutorial
Express framework tutorial
์šฐ๋ฆผ ๋ฅ˜
ย 
Do IoT Yourself 3rd : Open API - revision 3
Do IoT Yourself 3rd : Open API - revision 3Do IoT Yourself 3rd : Open API - revision 3
Do IoT Yourself 3rd : Open API - revision 3Hyunghun Cho
ย 

Similar to Booting Spring Data REST (20)

Ksug ์„ธ๋ฏธ๋‚˜ (์œค์„ฑ์ค€) (20121208)
Ksug ์„ธ๋ฏธ๋‚˜ (์œค์„ฑ์ค€) (20121208)Ksug ์„ธ๋ฏธ๋‚˜ (์œค์„ฑ์ค€) (20121208)
Ksug ์„ธ๋ฏธ๋‚˜ (์œค์„ฑ์ค€) (20121208)
ย 
Srping data rest
Srping data restSrping data rest
Srping data rest
ย 
[TECHCON 2019: MOBILE - Android]2.์˜ˆ์ œ์—์„œ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” Model ์ด์•ผ๊ธฐ
[TECHCON 2019: MOBILE - Android]2.์˜ˆ์ œ์—์„œ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” Model ์ด์•ผ๊ธฐ[TECHCON 2019: MOBILE - Android]2.์˜ˆ์ œ์—์„œ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” Model ์ด์•ผ๊ธฐ
[TECHCON 2019: MOBILE - Android]2.์˜ˆ์ œ์—์„œ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” Model ์ด์•ผ๊ธฐ
ย 
REST Ovewview
REST OvewviewREST Ovewview
REST Ovewview
ย 
ํŒŒ์ด์ฌ ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ 2ํƒ„
ํŒŒ์ด์ฌ ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ 2ํƒ„ ํŒŒ์ด์ฌ ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ 2ํƒ„
ํŒŒ์ด์ฌ ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ 2ํƒ„
ย 
ASP.NET Web API๋ฅผ ํ™œ์šฉํ•œ RESTful ์„œ๋น„์Šค ๊ฐœ๋ฐœ
ASP.NET Web API๋ฅผ ํ™œ์šฉํ•œ RESTful ์„œ๋น„์Šค ๊ฐœ๋ฐœASP.NET Web API๋ฅผ ํ™œ์šฉํ•œ RESTful ์„œ๋น„์Šค ๊ฐœ๋ฐœ
ASP.NET Web API๋ฅผ ํ™œ์šฉํ•œ RESTful ์„œ๋น„์Šค ๊ฐœ๋ฐœ
ย 
์ œ 4ํšŒ DGMIT R&D ์ปจํผ๋Ÿฐ์Šค : REST API - ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ์  ์•„ํ‚คํ…์ฒ˜
์ œ 4ํšŒ DGMIT R&D ์ปจํผ๋Ÿฐ์Šค : REST API - ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ์  ์•„ํ‚คํ…์ฒ˜์ œ 4ํšŒ DGMIT R&D ์ปจํผ๋Ÿฐ์Šค : REST API - ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ์  ์•„ํ‚คํ…์ฒ˜
์ œ 4ํšŒ DGMIT R&D ์ปจํผ๋Ÿฐ์Šค : REST API - ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ์  ์•„ํ‚คํ…์ฒ˜
ย 
ASP.NET Web API๋ฅผ ์ด์šฉํ•œ ์˜คํ”ˆ API ๊ฐœ๋ฐœ
ASP.NET Web API๋ฅผ ์ด์šฉํ•œ ์˜คํ”ˆ API ๊ฐœ๋ฐœASP.NET Web API๋ฅผ ์ด์šฉํ•œ ์˜คํ”ˆ API ๊ฐœ๋ฐœ
ASP.NET Web API๋ฅผ ์ด์šฉํ•œ ์˜คํ”ˆ API ๊ฐœ๋ฐœ
ย 
GKAC 2015 Apr. - Battery, ์•ˆ๋“œ๋กœ์ด๋“œ๋ฅผ ์œ„ํ•œ ์‰ฌ์šด ์›น API ํ˜ธ์ถœ
GKAC 2015 Apr. - Battery, ์•ˆ๋“œ๋กœ์ด๋“œ๋ฅผ ์œ„ํ•œ ์‰ฌ์šด ์›น API ํ˜ธ์ถœGKAC 2015 Apr. - Battery, ์•ˆ๋“œ๋กœ์ด๋“œ๋ฅผ ์œ„ํ•œ ์‰ฌ์šด ์›น API ํ˜ธ์ถœ
GKAC 2015 Apr. - Battery, ์•ˆ๋“œ๋กœ์ด๋“œ๋ฅผ ์œ„ํ•œ ์‰ฌ์šด ์›น API ํ˜ธ์ถœ
ย 
overview of spring4
overview of spring4overview of spring4
overview of spring4
ย 
2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCamp2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCamp
ย 
REST API ์„ค๊ณ„
REST API ์„ค๊ณ„REST API ์„ค๊ณ„
REST API ์„ค๊ณ„
ย 
Restful ์ œ๋Œ€๋กœ ์•Œ๊ธฐ(Getting to know the RESTful)
Restful ์ œ๋Œ€๋กœ ์•Œ๊ธฐ(Getting to know the RESTful)Restful ์ œ๋Œ€๋กœ ์•Œ๊ธฐ(Getting to know the RESTful)
Restful ์ œ๋Œ€๋กœ ์•Œ๊ธฐ(Getting to know the RESTful)
ย 
GraphQL overview #2
GraphQL overview #2GraphQL overview #2
GraphQL overview #2
ย 
๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ์‹ซ์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ
๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ์‹ซ์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ์‹ซ์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ
๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ์‹ซ์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ
ย 
[112]restแ„‹แ…ฆแ„‰แ…ฅ graph qlแ„€แ…ช relayแ„…แ…ฉ แ„€แ…กแ†ฏแ„‹แ…กแ„แ…กแ„€แ…ต แ„‹แ…ตแ„Œแ…ฅแ†ผแ„‹แ…ฎ
[112]restแ„‹แ…ฆแ„‰แ…ฅ graph qlแ„€แ…ช relayแ„…แ…ฉ แ„€แ…กแ†ฏแ„‹แ…กแ„แ…กแ„€แ…ต แ„‹แ…ตแ„Œแ…ฅแ†ผแ„‹แ…ฎ[112]restแ„‹แ…ฆแ„‰แ…ฅ graph qlแ„€แ…ช relayแ„…แ…ฉ แ„€แ…กแ†ฏแ„‹แ…กแ„แ…กแ„€แ…ต แ„‹แ…ตแ„Œแ…ฅแ†ผแ„‹แ…ฎ
[112]restแ„‹แ…ฆแ„‰แ…ฅ graph qlแ„€แ…ช relayแ„…แ…ฉ แ„€แ…กแ†ฏแ„‹แ…กแ„แ…กแ„€แ…ต แ„‹แ…ตแ„Œแ…ฅแ†ผแ„‹แ…ฎ
ย 
Webrtc ํ—ˆ์˜๋‚จ 20150528
Webrtc ํ—ˆ์˜๋‚จ 20150528Webrtc ํ—ˆ์˜๋‚จ 20150528
Webrtc ํ—ˆ์˜๋‚จ 20150528
ย 
Do IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open API
Do IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open APIDo IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open API
Do IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open API
ย 
Express framework tutorial
Express framework tutorialExpress framework tutorial
Express framework tutorial
ย 
Do IoT Yourself 3rd : Open API - revision 3
Do IoT Yourself 3rd : Open API - revision 3Do IoT Yourself 3rd : Open API - revision 3
Do IoT Yourself 3rd : Open API - revision 3
ย 

Booting Spring Data REST

Editor's Notes

  1. ์•ˆ๋…•ํ•˜์„ธ์š”. Booting Spring DATA REST ๋ฐœํ‘œ๋ฅผํ•˜๊ฒŒ๋œ ์ด๊ฒฝ์›์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์˜ฌํ•ด๋กœ ๊ฐœ๋ฐœ ๊ฒฝ๋ ฅ 4๋…„์ฐจ๊ฐ€ ๋๊ตฌ์š”. ํ˜„์žฌ๋Š” ์šฐ์•„ํ•œํ˜•์ œ๋“ค์—์„œ ๋ฐฐ๋ฏผํ”„๋ ˆ์‹œ๋ผ๋Š” ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ฐœํ‘œ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ด ๋ฐœํ‘œ๋ฅผ ๋“ฃ๊ธฐ ์œ„ํ•ด์„œ REST API๊ฐ€ ๋ฌด์—‡์ธ์ง€, Spring MVC๋ฅผ ์‚ฌ์šฉํ•ด ๋ดค๊ณ , Spring Data JPA ๋˜๋Š” Java ORM์„ ์‚ฌ์šฉํ•ด๋ณด์…จ๊ฑฐ๋‚˜ ๋ฌด์—‡์ธ์ง€ ์•„์…”์•ผ ๋“ฃ๊ธฐ์— ์ˆ˜์›”ํ•˜์‹ค๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐœํ‘œ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  3. ๋จผ์ € ์š”์ฆ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ชจ์Šต์€ ์–ด๋–ค ๋ชจ์Šต์ธ์ง€ ํ•œ๋ฒˆ ์‚ดํŽด ๋ณด๊ณ  ๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.
  4. 1. ์š”์ฆ˜์€ ๊ต‰์žฅํžˆ ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ ๊ธฐ๊ธฐ๋“ค์ด ์ƒ๊ฒจ๋‚ฌ์Šต๋‹ˆ๋‹ค. 2. ์ด ๊ธฐ๊ธฐ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์„œ๋ฒ„์™€ ํ†ต์‹ ์„ ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๋˜ํ•œ ์™ธ๋ถ€ API ์„œ๋ฒ„์™€ ์ˆ˜๋งŽ์€ ํ†ต์‹ ์„ ํ•˜๋Š”๋ฐ์š”. 3. ํด๋ผ์ด์–ธํŠธ ๊ด€์ ์—์„œ ๋ณด๋ฉด ์„œ๋ฒ„๋Š” ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. 4. ๊ทธ๋ž˜์„œ ์š”์ฆ˜ ์„œ๋ฒ„ ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ์ค‘ ํ•˜๋‚˜์ธ REST API๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ณผ๊ฑฐ์—๋Š” ํ˜„์žฌ๋ณด๋‹ค ํด๋ผ์ด์–ธํŠธ ๊ธฐ๊ธฐ์˜ ์ข…๋ฅ˜๋„ ๋งŽ์ง€ ์•Š์•˜๊ณ , ์„œ๋ฒ„์˜ ์š”๊ตฌ์‚ฌํ•ญ๋„ ๋น„๊ต์  ๋‹จ์ˆœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ ์˜์†ํ™” ๊ธฐ์ˆ  ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊นŒ์ง€ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉ๋œ ํ”„๋กœ์ ํŠธ์— ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  6. ํ•˜์ง€๋งŒ ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ๊ฐ€ ์ƒ๊ฒจ๋‚˜๋ฉด์„œ ์„œ๋ฒ„๋Š” ์ ์  ๋น„๋Œ€ํ•ด์ง€๊ณ , ๋„๋ฉ”์ธ ์š”๊ตฌ์‚ฌํ•ญ์€ ๋ณต์žกํ•ด์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„๋ฉ”์ธ์„ ๊ธฐ์ค€์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ์ด ๊ฐ๊ฐ์˜ ์„œ๋ฒ„ ์—ญ์‹œ REST API๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.
  7. ๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” REST API๋ฅผ Spring Data REST๋ฅผ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ์‰ฝ๊ณ  ๋น ๋ฅด๊ณ  ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์„์ง€ ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  8. Spring Data REST๋Š” REST API๋ฅผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ํ˜น์‹œ Spring Data REST๋ฅผ ํ˜„์—…์—์„œ ์‚ฌ์šฉํ•˜์‹œ๋Š”๋ถ„ ๊ณ„์‹ ๊ฐ€์š”? ์•„๋‹ˆ๋ฉด ๊ฐœ์ธ์ ์œผ๋กœ ์จ๋ณด์‹ ๋ถ„? ์‚ฌ์šฉํ•ด๋ณด์ง€ ์•Š์œผ์…จ์–ด๋„ ์ด ๋ฐœํ‘œ๋ฅผ ๋“ค์œผ์‹œ๊ณ  Spring Data REST๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๊ฐ€์…จ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.
  9. ๋‹ค์Œ์€ Spring Data REST์— ๋ช‡ ๊ฐ€์ง€ ํŠน์ง•์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Spring Data์—์„œ ์ œ๊ณตํ•˜๋Š” Repository ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋งŒ์œผ๋กœ REST API๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  10. ์ •์˜ํ•œ Repository ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์†Œ๋“œ ์„ ์–ธ๋งŒ์œผ๋กœ ๊ฒ€์ƒ‰ API๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. Spring Data์—์„œ๋Š” ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ํ•˜๋Š”๋ฐ์š”. ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ๋Š” Spring Data์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ ๋ฉ”์†Œ๋“œ๋ช…์„ ์ •์˜ํ•˜๋ฉด ๋ฉ”์†Œ๋“œ๋ช…์„ ๊ธฐ์ค€์œผ๋กœ ์กฐํšŒ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด ์กฐํšŒ์ฟผ๋ฆฌ๊ฐ€ ๊ฒ€์ƒ‰ API๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  11. Projection์€ ์—”ํ‹ฐํ‹ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  12. HATEOAS๋Š” Hypermedia As The Engine Of Application State์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค. HATEOAS๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ 1. ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋‚˜, 2. ๋งํฌ์ •๋ณด, 3. ๋ฆฌ์†Œ์Šค ๋“ฑ์„ Response Body๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  13. ํŠน์ง• ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋ฉด์„œ Spring Data์— ๋Œ€ํ•ด์„œ ๋ช‡๋ฒˆ ์–ธ๊ธ‰ํ–ˆ๋Š”๋ฐ ์ž ๊น ์„ค๋ช…์„ ํ•ด์•ผ ๋ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค. Spring Data๋Š” Data ๋ ˆ์ด์–ด๋ฅผ ์ถ”์ƒํ™”ํ•œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” jpa๋‚˜ mongodb, redis ๊ฐ™์€ ๊ตฌํ˜„์ฒด๋“ค์„ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  Spring Data์—์„œ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  14. 1. Spring Data REST๋Š” Spring Data API์™€ Spring Web MVC API๊ฐ€ ๊ฒฐํ•ฉ๋œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. 2. Spring Data๋Š” ๋ฐ์ดํ„ฐ ๋ ˆ์ด์–ด๋ฅผ ์ถ”์ƒํ™”ํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ์š”. Spring Data REST๋Š” ์ถ”์ƒํ™”๋œ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์–ด๋ฅผ REST API๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. 3. ์š”์ฆ˜ no_sql ์ €์žฅ์†Œ๋ฅผ ๋ณด๋ฉด ๋ฐ”๋กœ REST API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ ๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ ๋ณด๋ฉด Spring Data REST๋Š” ๋‹ค์–‘ํ•œ ์ €์žฅ์†Œ๋ฅผ ์ถ”์ƒํ™”๋ฅผ ํ•˜๊ณ  ๋ฐ”๋กœ REST API๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
  15. ๊ทธ๋ฆฌ๊ณ  Spring Data REST๋Š” JPA, Gemfire, MongoDB, Redis, Solr(์ ๋ผ) ์ด๋ ‡๊ฒŒ ์ด 5๊ฐ€์ง€ ์˜์†ํ™” ๊ธฐ์ˆ ์„ ์ง€์›ํ•˜๊ณ  ์˜ค๋Š˜ ์˜ˆ์ œ๋Š” Spring Data JPA๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค
  16. Spring MVC์™€ Spring Data REST๋กœ ๊ฒŒ์‹œํŒ REST API๋ฅผ ๋งŒ๋“  ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  17. ๊ฒŒ์‹œํŒ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •์˜ํ•œ ์—”ํ‹ฐํ‹ฐ UML์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 1. ํšŒ์›์„ ํ‘œํ˜„ํ•˜๋Š” Member์—”ํ‹ฐํ‹ฐ์™€ 2. ๊ฒŒ์‹œํŒ์„ ํ‘œํ˜„ํ•˜๋Š” Board ์—”ํ‹ฐํ‹ฐ 3. ๊ทธ๋ฆฌ๊ณ  ๊ฒŒ์‹œ๊ธ€์˜ ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ ๋‚ด์šฉ์„ ๊ด€๋ฆฌํ•˜๋Š” Contents ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ์€ ๋ฐ˜๋“œ์‹œ ํšŒ์›๋งŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  18. Board ์—”ํ‹ฐํ‹ฐ๋Š” Board๋ฅผ ์‹๋ณ„ํ• ์ˆ˜ ์žˆ๋Š” boardId์™€ ๊ฒŒ์‹œ๊ธ€์˜ ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ ๋‚ด์šฉ์ด ํฌํ•จ๋œ Contents ํƒ€์ž…์ด ์žˆ๊ณ ์š”. ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•œ Member ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•„์ˆ˜ ๋งคํ•‘์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  19. Contents ํด๋ž˜์Šค๋Š” ์ œ๋ชฉ์„ ํ‘œํ˜„ํ•˜๋Š” title ๋ณ€์ˆ˜์™€ ๋ณธ๋ฌธ ๋‚ด์šฉ์„ ํ‘œํ˜„ํ•˜๋Š” body ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
  20. ๋งˆ์ง€๋ง‰์œผ๋กœ ์œ ์ €๋ฅผ ํ‘œํ˜„ํ•˜๋Š” Member ์—”ํ‹ฐํ‹ฐ์ž…๋‹ˆ๋‹ค. 1. memberId์ธ ์‹๋ณ„์ž๊ฐ€ ์žˆ๊ณ ์š”. 2. ์œ ๋‹ˆํฌ ์ปฌ๋Ÿผ์œผ๋กœ ์„ค์ •๋œ username๊ณผ 3. firstName, lastName์ด ์žˆ๊ณ , 4. ๊ทธ๋ฆฌ๊ณ  ์ด Member๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ์ธ Board List๊ฐ€ ๋งคํ•‘๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
  21. ๊ทธ๋Ÿฌ๋ฉด ์ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ Spring MVC์—์„œ REST API๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  22. BoardController๋Š” boards๋ผ๋Š” url๋กœ ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์žฅํ‘œ์— ๊ตฌํ˜„์ฒด๋Š” ์—†์–ด์š”. ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค ์ •๋„๋งŒ ๋ณด์—ฌ๋“œ๋ฆฌ๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.
  23. ๊ทธ๋ฆฌ๊ณ  BoardRepository๋ฅผ ์˜์กดํ•ด ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” BoardService ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  24. ๊ฒŒ์‹œ๊ธ€์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— insert, update, select, deleteํ•  ์ˆ˜ ์žˆ๋Š” BoardRepository ์ž…๋‹ˆ๋‹ค.
  25. 1. ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ๋Š” ๋Œ€๋ถ€๋ถ„ ๋ฐ˜๋ณต์ ์ด๊ณ  ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. 2. ์ฟผ๋ฆฌ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๊ณ  ์˜ˆ์ œ๋กœ ๋ณด์—ฌ๋“œ๋ฆฐ API๋„ ๋Œ€๋ถ€๋ถ„ ๋ฐ˜๋ณต์ ์ด๊ณ  ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค.
  26. ๊ทธ๋Ÿผ Spring Data REST๋Š” REST API๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๋ณผ๊นŒ์š”? ๋†€๋ž„์ˆ˜๋„ ์žˆ์œผ๋‹ˆ๊นŒ, ์‹ฌํ˜ธํก ํ•œ๋ฒˆ์”ฉ ํ•˜๊ณ  ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.ใ…‹ใ…‹
  27. ์ž ๋๋‚ฌ์Šต๋‹ˆ๋‹ค! BoardRepository ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋งŒ์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ API๋ฅผ ๋‹ค ๋งŒ๋“ค์—ˆ๊ณ ์š”. ์ง„์งœ ๋‹ค ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€, ๋ฐ๋ชจ๋ฅผ ํ•œ๋ฒˆ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒŒ์š”.
  28. BoardRepository๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. RepositoryRestResource ์• ๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด BoardRepository ์ธํ„ฐํŽ˜์ด์Šค๋Š” REST API๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  29. url ๋งคํ•‘์€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ์„ค์ •๋œ Board ์—”ํ‹ฐํ‹ฐ๋ช…์— ๋ณต์ˆ˜์ธ boards๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  id path๋Š” Board ์—”ํ‹ฐํ‹ฐ์˜ ์‹๋ณ„์ž ํƒ€์ž…์ธ Long ํƒ€์ž…์ด ๋ฉ๋‹ˆ๋‹ค.
  30. ์ด๋Ÿฐ์‹์œผ๋กœ URL ๋งคํ•‘์ด ๋ฉ๋‹ˆ๋‹ค.
  31. CrudRepository interface๋งŒ ์ƒ์†๋ฐ›์•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ REST API๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์„๊นŒ์š”??
  32. 1. ๋ฐ”๋กœ ๋ฉ”์†Œ๋“œ๊ฐ€ REST API๋กœ ํ‘œํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 2. CrudRepository interface์—๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด ๋ฉ”์†Œ๋“œ๋“ค์ด ์–ด๋–ค API๋ฅผ ์ œ๊ณตํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  33. ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ, ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” save ๋ฉ”์†Œ๋“œ๋Š” ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ๊ณผ ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ REST API๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ดํ•ด๊ฐ€์…จ์ฃ ??
  34. findOne ๋ฉ”์†Œ๋“œ๋Š” id๋กœ ์กฐํšŒ ๊ฐ€๋Šฅํ•œ API๋ฅผ ์ œ๊ณตํ•˜๊ณ ์š”.
  35. findAll ๋ฉ”์†Œ๋“œ๋Š” ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  36. Delete ๋ฉ”์†Œ๋“œ๋Š” ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  37. ํŠน์ง•์—์„œ Query-Method๋ฅผ ์ด์šฉํ•ด์„œ ๊ฒ€์ƒ‰ API๋„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ์ฃ ? ๊ฒ€์ƒ‰ API๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๋ณผ๊นŒ์š”?
  38. ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ์ด ํŠน์ • ๋ฌธ์ž์—ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ ๊ฒ€์ƒ‰ API๋ฅผ findByContentsTitleStartsWith ๋ฉ”์†Œ๋“œ ์„ ์–ธ๋งŒ์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  39. RestResource ์• ๋…ธํ…Œ์ด์…˜์— path๋ฅผ starts-title๋กœ ์„ค์ •ํ•˜๋ฉด /boards/search/starts-title๋กœ url ๋งคํ•‘์ด๋ฉ๋‹ˆ๋‹ค.
  40. ๊ทธ๋ฆฌ๊ณ  Param ์• ๋…ธํ…Œ์ด์…˜์— ์„ค์ •๋œ title์ด url ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  41. ๊ทธ๋Ÿฌ๋ฉด ์ œ๋ชฉ์ด h๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  URL์„ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  42. ๊ทธ๋Ÿฌ๋ฉด /boards/search/starts-title url์— title ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ h๋กœ URL์„ ๋งŒ๋“ค์–ด ์š”์ฒญํ•˜๋ฉด
  43. findByContentsTitleStartsWith ๋ฉ”์†Œ๋“œ๋Š” Title ์ปฌ๋Ÿผ์„ like ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ ํ›„์— API๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๊ตฌํ˜„์ฒด๋ฅผ ํ•˜๋‚˜๋„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  API๋ฅผ ๋งŒ๋“ค์—ˆ์ฃ ? ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Spring Data REST์— ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์ด์˜€์Šต๋‹ˆ๋‹ค.
  44. ๊ทธ๋ž˜์„œ Spring Data REST๋ฅผ ์–ด๋–ป๊ฒŒ ์–ด๋””์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€๋Š” ์กฐ๊ธˆ ๋’ค์— ์ด์•ผ๊ธฐํ•˜๊ธฐ๋กœ ํ•˜๊ณ  ๋ผ์ด๋ธŒ ์ฝ”๋”ฉ์„ ํ•˜๋ฉฐ ์‚ฌ์šฉ๋ฒ•์„ ๋” ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  45. ์žฅ์ ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ์— ๋Œ€ํ•œ API๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ณ  ํ™•์žฅ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Spring Data๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์‰ฝ๊ฒŒ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  46. ํ•˜์ง€๋งŒ! ๋ณด์ด๋Š”๊ฒŒ ๋‹ค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  47. ์ œ๊ฐ€ ์žฅ์ ๋งŒ ์จ ๋†“๊ณ  ๋‹จ์ ์€ ์จ๋†“์ง€ ์•Š์•˜๋Š”๋ฐ์š”. ์ œ๊ฐ€ ์ƒ๊ฐํ–ˆ์„๋•Œ Data REST๋Š” ์•Œ์•„์•ผํ•  ๊ธฐ์ˆ ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. KSUG ํฐ ์ผ๊พผ์ธ ๋ฐ•์šฉ๊ถŒ๋‹˜๊ณผ ์ด์•ผ๊ธฐ ํ• ๋•Œ Spring Data REST๋ฅผ ์ข…ํ•ฉ ์˜ˆ์ˆ ์ด๋ผ๊ณ  ํ‘œํ˜„ํ–ˆ๋Š”๋ฐ์š”. ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ๋ณด๊ธฐ์—” ์ข‹์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ์•Œ์•„์•ผํ•  ๊ธฐ์ˆ ์ด ๋งŽ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
  48. Spring Data REST๋ฅผ ์–ด๋””์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์ƒ๊ฐ์„ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.
  49. ์ฒซ ๋ฒˆ์งธ๋Š” ์˜์กด์„ฑ์ด ๋‚ฎ์€ ๋„๋ฉ”์ธ์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ปค๋จธ์Šค ์ฃผ๋ฌธ ๋„๋ฉ”์ธ์€ ์ƒํ’ˆ, ๊ฒฐ์ œ, ํฌ์ธํŠธ, ์ฟ ํฐ ๋“ฑ ๋‹ค์–‘ํ•œ ํƒ€ ๋„๋ฉ”์ธ์— ์˜์กด์„ฑ์ด ๋†’์€ ๋ฐ˜๋ฉด ์ฟ ํฐ์ด๋‚˜ ํฌ์ธํŠธ๋Š” ํƒ€ ๋„๋ฉ”์ธ์— ์˜์กด์„ฑ์ด ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  50. ๋‘ ๋ฒˆ์งธ๋Š” ์‚ฌ๋‚ด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. Spring Data REST๋Š” data ๋ ˆ์ด์–ด๋ฅผ ๊ทธ๋Œ€๋กœ REST๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ด๋ผ๊ณ  ๋ง์”€๋“œ๋ ธ๋Š”๋ฐ์š”. ์‚ฌ๋‚ด ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•ด์•ผ๋˜๋Š” ์‹œ์Šคํ…œ์— ์ ์šฉํ•ด๋ณด๋ฉด ์ข‹์„๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Spring Data REST๋Š” HAL browser๋ผ๋Š” REST Client ํˆด์„ ๋””ํŽœ๋˜์‹œ ์ถ”๊ฐ€๋งŒ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  51. ๋งˆ์ง€๋ง‰์œผ๋กœ ์กฐํšŒ๋งŒ ์ ์šฉ์„ ํ•ด๋ณด๋Š”๊ฑด๋ฐ์š”. ๋ผ์ด๋ธŒ์ฝ”๋”ฉ์„ ํ•˜๋ฉด์„œ ๋ดค๋˜ ReadOnlyPagingAndSortingRepository๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  52. ๋๊นŒ์ง€ ๋ฐœํ‘œ ๋“ค์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.