스프링부트 2.x PetClinic 웹프로젝트를 가지고, 기술정리를 해봅니다.
공통: 스프링부트 2.x, Hsql dB, 인텔리J 개발툴, Maven 빌드툴 사용.
기존 소스에 Owners도메인모델에 age필드 추가.
(아래 작업결과)
- Owner.java 파일에서 도메인 모델 추가(아래 @NotNull, @Positive, @Digits 는 입력폼에서 유효성 검사에 사용됩니다.)
관련기술 참조: https://javacan.tistory.com/entry/Bean-Validation-2-Spring-5-valiidatiion
@Entity
@Table(name = "owners")
public class Owner extends Person {
@Column(name = "age")
@NotNull
@Positive
@Digits(fraction = 0, integer = 3)
private Integer age;
- schema.sql 파일에서 스키마 테이블 컬럼 추가(Hsql DB)
CREATE TABLE owners (
id INTEGER IDENTITY PRIMARY KEY,
first_name VARCHAR(30),
last_name VARCHAR_IGNORECASE(30),
age INTEGER NOT NULL,
address VARCHAR(255),
city VARCHAR(80),
telephone VARCHAR(20)
);
- schema.sql (Mysql dB사용시 아래 내용으로)
CREATE TABLE IF NOT EXISTS owners (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(30),
last_name VARCHAR(30),
address VARCHAR(255),
age INT(4) UNSIGNED NOT NULL,
city VARCHAR(80),
telephone VARCHAR(20),
INDEX(last_name)
) engine=InnoDB;
- 타임리프 입력폼 createOrUpdateOwnerForm.html 파일에 필드 추가(아래 Age 부분)
<form th:object="${owner}" class="form-horizontal" id="add-owner-form" method="post">
<div class="form-group has-feedback">
<input
th:replace="~{fragments/inputField :: input ('First Name', 'firstName', 'text')}" />
<input
th:replace="~{fragments/inputField :: input ('Last Name', 'lastName', 'text')}" />
<input
th:replace="~{fragments/inputField :: input ('Age', 'age', 'text')}" />
<input
th:replace="~{fragments/inputField :: input ('Address', 'address', 'text')}" />
<input
th:replace="~{fragments/inputField :: input ('City', 'city', 'text')}" />
<input
th:replace="~{fragments/inputField :: input ('Telephone', 'telephone', 'text')}" />
</div>
Ps. 스프링에서 빈(Bean)이란, 스프링의 IoC(Inversion of Control)컨테이너에서 등록 관리하는 자바 클래스(객체)를 가리키며,
빈으로 등록하는 방법은, 해당 클래스에 @Controller, @Repsitory, @Service 등의 애노테이션을 붙이는 거나,
또는 @Configuration클래스의 매서드에 @Bean 애노테이션을 붙여서 직접 등록이 가능합니다.
IoC컨테이너가 생성될때 @ComponentScan 으로 등록된 Bean객체를 사용할때는 아래처럼,
클래스 내부 매서드에서 호출할때, new 키워드로 객체를 생성할 필요가 없어서 코딩이 단순해 집니다.
(아래) - new 객체 생성은 스프링 IoC 컨테이너에서 자동 처리 합니다.
IoC-반전의명령 에서 DI-의존성주입 사용예 3가지(아래 내용중 의존성주입하기방식1을 추천 합니다.)
// 주입하기 방식1 생성자 방식 아래 OwnerController(OwnerRepository clinicService 사용
private final OwnerRepository owners;
// OwnerController 에 PetRepository 주입하기 방식2=필드방식 @Autowired 사용
// @Autowired //스프링2 부터 생략가능
private PetRepository petRepository;
/// OwnerController 에 PetRepository 주입하기 방식3=셋터방식 @Autowired 사용
// @Autowired //스프링2 부터 생략가능
public void setPetRepository(PetRepository petRepository) {
this.petRepository = petRepository;
}
private VisitRepository visits;
public OwnerController(OwnerRepository clinicService, VisitRepository visits) {
this.owners = clinicService;
this.visits = visits;
}
- ApplicationContext로 IoC컨테이너에 등록된 Bean확인(아래)
- IoC(Inverstion of Control) 반전의 Control 테스트(아래)
@MockBean
private OwnerRepository owners; //SingleTone Scope 사용
@Autowired
ApplicationContext applicationContext;
@Test
public void getBean() {
OwnerRepository bean = applicationContext.getBean(OwnerRepository.class);
//assertThat(bean).isNull();//Null 이 아니면, 실행 중지 실패 Fail
assertThat(bean).isNotNull();//Null 이 아니기 때문에, 성공 Success
System.out.println("owners: getBean = " + bean);
System.out.println("owners: IoC에 자동주입된 Bean = " + owners);//위 getBean 필요없음.
}
- 지금까지 작업한 파일
20200109_2spring-petclinic.zip
1/3No프레임웍 jsp (0) | 2020.01.19 |
---|---|
4_PetClinic스프링부트 프로젝트 (0) | 2020.01.12 |
2_PetClinic스프링부트 프로젝트 (0) | 2020.01.08 |
1_PetClinic스프링부트 프로젝트 (0) | 2020.01.07 |
1/2_전자정부표준프레임웍 활용 (0) | 2020.01.03 |
댓글 영역