web thymeleaf jpa h2(내장DB)를 선택하여 프로젝트 생성하기
$spring init -d=web,thymeleaf,data-jpa,h2 --groupId=com.manning  
--artifactId=readinglist --name="Reading List" --package-name=readinglist 
--description="Reading List Demo" --build gradle readinglist

@SpringBootApplication 애너테이션에는 아래 세가지 어노테이션이 모두 들어있다
@Configuration
자바 기반 구성 클래스(XML이 아닌)
@ComponentScan
컴포넌트 검색 기능으로 웹 컨트롤러 클래스나 다른 컴포넌트 클래스를 컨텍스트에 빈으로 등록
컨트롤러에는 @Controller 애너테이션 추가
@EnableAutoConfiguration
수동 구성 코드를 대체하는 자동 구성이 활성화된다

$gradle bootRun //애플리케이션 빌드 실행
$gradle build //빌드
$java -jar build/libs/readinglist-0.0.1-SNAPSHOT.jar //빌드된 jar 실행
@SpringApplicationConfiguration 애너테이션
contextLoads() 애플리케이션 구성에 문제가 없다면 정상 실행

application.properties server.port=8000 서버포트를 8000으로 변경한다

전이적 의존성 확인하기(구체적인 라이브러리 의존성)
$gradle dependencies
$mvn dependency:tree
전이적 의존성 제외하기
compile('org.springframework.boot:spring-boot-starter-web'){
    exclude group:'com.fasterxml.jackson.core'
}

  org.springframework.boot
  spring-boot-starter-web
  
    
      com.fasterxml.jackson.core
    
  

직접 버전 설정

  com.fasterxml.jackson.core
  jackson-databind
  2.4.3

compile('com.fasterxml.jackson.core:jackson-databind:2.4.3') //최신버전 

compile('org.springframework.boot:spring-boot-starter-web'){
    exclude group:'com.fasterxml.jackson.core'
}
compile('com.fasterxml.jackson.core:jackson-databind:2.3.1') //구 버전
자동구성 사용하기
클래스패스에 있는 것들을 위한 빈들과 기능등을 자동 구성한다.

도메인 정의
@Entity 클래스를 엔티티로 지정
@Id @GeneratedValue(strategy=GenerationType.AUTO) 자동으로 값을 제공하는 유니크 아이디

리포지토리 인터페이스 선언
JpaRepository를 확장하여 연산수행 <도메인타입, ID 프로퍼티 타입> 런타임에 자동으로 구현

웹 인터페이스 만들기
@Controller @RequestMapping("/")
컨텍스트 빈에 자동 등록하기 위해 @Controller
url경로 /에 메소드를 매핑 @RequestMapping("/")
@AutoWired 세터나 생성자 필드 등을 자동생성해준다
@RequestMapping(method=RequestMethod.GET) //http GET 방식으로 지정
public String readerBooks(Model model){
  List readingList = readingListRepository.findByReader(reader);
  if(readingList !=null){
    model.addAttribute("books",readingList); //html에서 사용될 books 항목을 지정해준다
  }
  return "readingList";//렌더링할 뷰의 이름을 반환한다 readingList.html
}
@RequestMapping(method=RequestMethod.POST) //http POST 방식으로 지정
public String addToReadingList(Book book){ //추가 버튼 클릭시 호출된다
  book.setReader(reader);
  readingListRepository.save(book);  //입력된 사항을 저장한다
  return "redirect:/";  //리다이렉트 하면서 반환한다(다른 컨트롤러 메서드가 처리)
}
readingList.html의 역할
주소 / 에 접속(get:readerBooks)하면 /readingList.html 에 접속되고
북을 추가(post:addToReadingList)하면 / 로 리다이렉트되면서
다시 /readingList.html에 접속하여 추가된 북을 확인한다
public class JdbcTemplateCondition implements Condition{
  @Override
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata){
  try{
    context.getClassLoader().loadClass("org.springframework.jdbc.core.JdbcTemplate");
    return true;
  } catch(Exception e){
    return false;
  }
}

@Conditional(JdbcTemplateCondition.class)
@Bean
public MyService myService(){
  //...
}
JdbcTemplate이 클래스패스에 있을 때만 MyService 빈을 생성


 조건 애너테이션 

 구성을 적용하는 조건 

 @ConditionalOnBean

 대상 빈을 구성함 

 @ConditionalOnMissingBean

 대상 빈을 아직 구성하지 않음

 @ConditionalOnClass

 대상 클래스가 클래스 패스에 있음

 @ConditionalOnMissingClass

 대상 클래스가 클래스패스에 없음

 @ConditionalOnExpression

 스프링 표현식 언어(SpEL)가 참(true)

 @ConditionalOnJava

 자바 버전이 특정 버전 또는 범위에 맞음

 @ConditionalOnJndi

 JNDI InitailContext가 사용가능하고 

 선택적으로 지정한 JNDI 위치가 있음

 @ConditionalOnProperty

 지정한 구성 프로퍼티가 기대하는 값을 가짐

 @ConditionalOnResource

 지정한 리소스가 클래스패스에 있음

 @ConditionalOnWebApplication

 애플리케이션이 웹 애플리케이션임

 @ConditionalOnNotWebApplication

 애플리케이션이 웹 애플리케이션이 아님


블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,