들어가기에 앞서
실제 프로젝트 진행했던 코드 내용은 업로드하지 않았습니다
8. Business Logic Test
(1) unit test, solitary test
- 필요로 하는 것들만 사용하거나 mocking, slice test
- 컨트롤러 입출력의 확인
- 에러의 검증
- 비즈니스 로직의 동작
(2) integration test, sociable test
@SpringBootTest
- 인증 + API 호출
- API 호출 -> 비즈니스 -> 데이터 접근 -> 응답까지
(3) Integration test 진행
- test 폴더에
integration
package
-> APIEventIntegrationTest 생성
-> @SpringBootTest
-> @AutoConfigureMockMvc
9. View, View Templtate
(1) Thymeleaf 특징
HTML5
웹 표준 준수 템플릿
- 전체적인 문법이
HTML5
마크업 표준을 최대한 해치지 않게끔 설계
- Decoupled logic : 템플릿 문법을 아예 템플릿에서 분리 가능
- 순수한 마크업만 남음 -> 템플릿 엔진이 작동하지 않아도 렌더링 되는 정적 목업 페이지
- 디자이너가 이해하기 쉬운 코드
- 문법
- "th:" tage
- "data-th" attribute
- decoupled logic
- Expressions
- Variable Expressions : ${...}
- Selection Variable Expressions : *{...}
- Message Expressions : #{...}
- Link URL Expressions : @{...}
- Fragment Expressions : ~{...}
- 기타 내용은 추후 강의 자료 좀 더 확인
- 템플릿 엔진 vs 자바스크립트 : 역시나 자바스크립트 기반 프레임워크가 압도적...
- properties :
spring.thymeleaf.cache=false
10. 작업 효율 향상을 위한 Properties
(1) SpringBootProperties
- logging
- debug
- trace
- logging.level.원하는패키지이름=debug (혹은 trace)
- banner
- config
- spring.config.activate.on-profile * (spring.profiles가 deprecated 됨)
- spring.config.import
- spring.config.use-legacy-processing
- main
- spring.main.banner-mode
- spring.main.lazy-initialization
- web
- spring.hateoas.use-hal-as-defalut-json-media-type
- spring.mvc.converters.preferred-json-mapper
- spring.mvc.format.date
- spring.mvc.format.date-time
- spring.mvc.format.time
- server
- server.error.whitelabel.enabled
- server.port
- security, actuator, devtools...
(2) Rest Repositories
- Repository로부터
REST API
를 자동으로 만들어주는 기술
Spring Data REST
를 사용
- 페이징, 정렬, 리미트 사용 가능
QueryDSL Extension
을 함께 사용하면 큰 노력 없이 컬럼별 검색 기능까지 사용 가능
- 사실 많이 사용하지는 않음
- 도메인을 직접 API에 노출하는 것을 꺼림
- 복잡한 요구사항에 맞춰 API 설계를 하고 싶을 경우 부적합
- 설정을 잘 하지 않으면 불필요 API 노출 우려
- 실무에서 API는 필요에 따라 직접 만드는 편
- 사용을 고려할 만한 상황
- 내부에서 사용하는 애플리케이션 제작 시
- 도메인이 복잡하지 않을 때
- 요구사항이 복잡하지 않고 심플한 CRUD로 구성되어 있을 때
- 빠르게 만들어야 할 때
- 기존 도메인 클래스에
@Entity
추가 (DB와 연동) -> PK 필요
@Id
, @GeneratedValue(strategy = GenerationType.IDENTITY)
- properties :
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace 기억해둘 것
spring.jpa.defer-datasource-initialzation=true
spring.jpa.hibernavte.ddl-auto=create-drop
spring.jpa-show=sql=true
spring.jpa.properties.hibernate.format_sql=true
- 코드 예제
EventRepository extends JpaRepository<Event, Long>, QuerydslPredicateExecutor<Event>, QuerydsBinderCustomizer<QEvent>
@override
customize(QuerydslBindings bindings, QEvent root) {
binding.excludeUnlistedProperties(true);
binding.including(root.placeid, root.eventName.....)
binding.bing(root.eventName).first(StringExpression::likeIgnoreCase);
.....
(3) Rest Repositories HAL Explorer
- 무조건 넣고 시작해도 무방할 정도
- 스프링 부트 모듈들의 세부 설정을 개발에 적합한 형태로 자동으로 바꿔줌
- Automatic restart - 자바 코드가 바뀌면 자동으로 애플리케이션을 재시작
- Live reload - 정적 페이지가 바뀌면 자동으로 브라우저 웹페이지 refresh
(5) Actuator
- 스프링 부트의 다양한 설정과 지표를 모니터링할 수 있는 도구
- 내가 만든 빈이 잘 등록되었는가
- 내가 만든 빈이 다른 빈들과 어떤 연관 관게를 맺고 있는가
- 내가 설정한 환경 변수, 프로퍼티가 잘 등록되었는가
- 내가 의도한 로깅이 잘 일어나고 있는가
- 캐시 / 시스템이 잘 동작하고 있는가 등
- 기본 엔드포인트와 추가 활성화 엔드포인트가 있음