스프링 안에서 동작하는 빈 생성 및 관리 주체
스프링 컨테이너가 생성하고 관리하는 객체
핵심 관점, 부가 관점으로 나누어 프로그래밍 하는 것
root-context.xml -> application.properties로 변경
스프링에서 xml 파일로 나눠져 있던 설정들을 application.properties에서 간단하게 설정할 수 있다
ex) log4j2.xml, root-context.xml에서 설정한 로그레벨, data source 설정들을 아래와 같이 간단하게 설정 가능하다
#서버 연결 설정
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:포트번호/db이름
spring.datasource.username=사용자이름
spring.datasource.password=비밀번호
#로그파일 설정
logging.level.org.springframework=info
logging.level.com.프로젝트그룹=debug
@Controller : Thymeleaf 사용 -> 서버사이드 템플릿 , HTML의 구조에 추가적인 태그없이 선언적으로 데이터 바인딩 처리
Model에 값을 담아야하며, html 파일이 필요하다
템플릿 : JSP처럼 데이터를 생성하지 않고, 만들어진 결과에 데이터를 맞추어서 보여준다
동작 방식은 비슷하나 처리 방식이 다르다
/controller/SampleController.java
@Controller
@Log4j2
public class SampleController {
@GetMapping("/hello")
public void hello(Model model){
log.info("hello.........");
model.addAttribute("msg","hello world");
}
}
/resources/templates/hello.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 th:text="${msg}"></h1>
</body>
</html>
@RestController : 순수하게 데이터만 송수신한다
별도의 라이브러리 없이 스프링부트는 기본적으로 JSON 처리를 지원한다
/controller/SampleJSONController
@RestController
@Log4j2
public class SampleJSONController {
@GetMapping("/helloArr")
public String[] helloArr() {
log.info("helloArr.................");
return new String[]{"AAA", "BBB", "CCC"};
}
}
자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법
ORM을 이용한 자바 객체와 관계형 데이터베이스 매핑 : java obejct <--> OR <--> Relational Database
ORM의 종류 중 하나
자바는 JPA를 표준으로 사용
java persistence API
자바에서 관계형 데이터베이스를 사용하는 방식을 정의한
특정 데이터베이스에 종속되지 않는다
객체지향적 설계 가능
유지보수 유리
생산성 향상
복잡한 쿼리 처리
성능 저하의 위험성
배우는데 시간이 꽤 걸림
JPA 인터페이스를 구현한 구현체 = 실제 코드에서 사용
애플리케이션<-->스프링 데이터 JPA
<-------------------------->JPA | 하이버네이트 | JDBC <--> 데이터베이스
페이징 처리는 pageable 타입의 객체를 파라미터로 전달하여 구현한다
PageRequest.of() 기능을 이용하여 개발한다
PageRequest.of(페이지 번호, 사이즈) : 페이지 번호는 0부터 시작한다
PageRequest.of(페이지 번호, 사이즈, sort)
Page findByTitleContiningOrderByTnoDesc(String keyword, Pageable pageable)
@Query -> JPQL
@Query 어노테이션의 value로 작성하는 문자열을 JPQL
JPA의 구현체 하이버네이트 프레임워크가 사용하는 HQL을 동적으로 생성하는 프레임워크
자바코드를 이용하여 타입의 안전성을 유지한 상태에서 원하는 쿼리를 작성할 수 있다
Querydsl을 이용하면 Q도메인이라는 객체 존재
목적 : 타입 기반으로 코드를 이용해서 JPQL쿼리를 생성하고 실행하는 것
목표
1. spring data jpa를 이용해서 영속 계층 처리
2. 타임리프를 이용해서 화면처리
3. 스프링 부트를 이용한 컨트롤러와 서비스 처리
구현
1. 서비스 계층과 DTO 구현
BoardRepository의 메소드는 서비스 계층을 통해서 DTO로 변환되어 처리되도록 구성한다
엔티티 객체는 영속 컨텍스트에서 관리되므로 가능하면 많은 계층에서 사용되지 않도록 구성한다
ModelMapper 를 이용한다
특정한 uri + http 메서드 --> '특정한 자원(resource)에 특정한 작업'을 지정하는 방식
브라우저에서 서버를 호출하지만 모든 작업이 브라우저내에서 이루어지므로 현재 브라우저의 화면의 변화없이 서버와 통신할 수 있도록
자동완성, 지도 서비스
js+xml-->js+json
get /boards/123 123번 게시물 조회
post /boards/ 신규 게시물 등록(신규 게시물에 대한 데이터)
put /boards/123 123번 게시물 수정(수정에 필요한 데이터)
delete /boards/123 123번 게시물 삭제
JPA 연관관계 판단기준
1. 항상 변화가 많은 쪽으로 결정
2. ERD에서 FK 기준으로 결정
예) 회원--게시물 관계
1. 게시물은 회원에 의해서 작성된다
2. 회원이 게시물을 작성한다
회원이 게시물을 작성하고 게시물에 여러 개의 파일과 댓글이 있고
각 게시글에 회원의 좋아요(like)가 있고, ...
객체지향 JPA방식과 관계형 데이터베이스와 다름점을 구분해서 정리