์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[JPA]์„œ๋น„์Šค, ์ปจํŠธ๋กค๋Ÿฌ ๋งŒ๋“ค์–ด ๋ณด๊ธฐ - 4

๋ฏธ๋กœ910 2024. 10. 2. 12:34
๐Ÿ’ก
1. DTO ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ๋‹ค.
2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด์„œ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ๋‹ค.
3. ์„œ๋น„์Šค ๊ณ„์ธต, ์ปจํŠธ๋กค๋Ÿฌ ๊ณ„์ธต์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ž‘์—… 1
DTO(Data Transfer Object) ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ (๊ฒŒ์‹œ๊ธ€ ์ €์žฅ)

DTO๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•œ ๊ฐ์ฒด๋กœ, ์ฃผ๋กœ ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,
ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ, ํ˜น์€ ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@NoArgsConstructor
@AllArgsConstructor
@Getter
// ์ฆ‰, ์ฃผ๋กœ ๊ณ„์ธต๊ฐ„์— ๋ฐ์ดํ„ฐ ์ „์†ก ๋ชฉ์ ์œผ๋กœ ์„ค๊ณ„ ๋œ๋‹ค.
public class ArticleDTO {

	private String title;
	private String content;

	// ์—ฌ๊ธฐ์„œ ArticleDTO --> Articl ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ณ€ํ™˜ ์‹œํ‚ค๋Š”
	// ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
	public Article toEntity() {
		return Article.builder()
				.title(this.title)
				.content(this.content)
				.build();
	}

}

 

์ž‘์—… 2
์„œ๋น„์Šค ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ (๊ฒŒ์‹œ๊ธ€ ์ €์žฅ)

์„œ๋น„์Šค ๊ณ„์ธต์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
์„œ๋น„์Šค ๊ณ„์ธต์€ ์ฃผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ์ค‘๊ฐ„ ๊ณ„์ธต์œผ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
@RequiredArgsConstructor
@Service // IoC (๋นˆ์œผ๋กœ ๋“ฑ๋ก)
public class BlogService {
	
	//@Autowired // DI <-- ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ€๋…์„ฑ ๋•Œ๋ฌธ์— ์ž‘์„ฑ์„ ํ•ด์ค€๋‹ค.
	private final PostRepository postRepository;
	
	@Transactional // (์ž‘์—…์˜ ๋‹จ์œ„) // ์“ฐ๊ธฐ ์ง€์—ฐ ์ฒ˜๋ฆฌ๊นŒ์ง€
	public Article save(ArticleDTO dto) {
		// ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ž‘์„ฑ...
		return postRepository.save(dto.toEntity());
	}
    }

@Service ์–ด๋…ธํ…Œ์ด์…˜์€ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ(Bean)์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๋Š” ์—ญํ• 

์ฆ‰, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์— ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.

๐Ÿ’ก
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(ApplicationContext)๊ฐ€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ(Spring Container)๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ํ•ต์‹ฌ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋“ค(Bean)์„ ์ƒ์„ฑํ•˜๊ณ , ์ด ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋ฉฐ,
์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

์ž‘์—… 3
์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ (๊ฒŒ์‹œ๊ธ€ ์ €์žฅ)

์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ (URL ๋งตํ•‘), ๊ทธ ์š”์ฒญ์„ ์„œ๋น„์Šค ๊ณ„์ธต์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
@RequiredArgsConstructor
@RestController // @controller + @responsebody
public class BlogApiController {
	
	private final BlogService blogService;
		
	// URL , ์ฆ‰, ์ฃผ์†Œ ์„ค๊ณ„ - http://localhost:8080/api/article
	@PostMapping("/api/articles")
	public ResponseEntity<Article> addArticle(@RequestBody ArticleDTO dto) {
		// 1. ์ธ์ฆ ๊ฒ€์‚ฌ
		// 2. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ 
		Article savedArtilce = blogService.save(dto);
		return ResponseEntity.status(HttpStatus.CREATED).body(savedArtilce);
	}
	}

postman ์‚ฌ์šฉํ•˜์—ฌ post๋กœ ๋˜์ง€๊ธฐ