상세 컨텐츠

본문 제목

3_PetClinic스프링부트 프로젝트

JSP·자바·코틀린

by 김일국 2020. 1. 9. 12:49

본문

스프링부트 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


20200109_2spring-petclinic.zip
0.49MB

관련글 더보기

댓글 영역