스프링으로 Hello world구현 할려면
Web.xmlmaven dispatch
servelt
Controller
class
tomcat Hello world
Web Application
5.
스프링 부트 핵심
•자동구성
• 공통으로 필요한기능을 자동으로 구성
• 스타터 의존성
• 어떤 기능이 필요한지 알려주면 LIB를 빌드에 추가
• 명령줄 인터페이스(CLI)
• 액추에이터
6.
스프링에서 jdbcTemplate 사용하기
•jdbcTemplate bean생성
• Datasource 의존성 주입
• 이외에 많은 구성들이 이런식으로 작성.
•일일이 작성할 필요가 있을까?
7.
자동 구성
• Classpath에H2라이브러리, jdbctemplate를 발견하면 spring
boot에서 자동으로 구성.
• Spring boot는 구성의 부담을 제공하는 여러가지 방법을 제공.
8.
프로젝트 빌드에 의존성추가하기
• 어떤 라이브러리가 필요한가?
• 라이브러리 그룹과 아티팩트는 ?
• 버전은 ?
• 다른 라이브러리와는 잘 동작할까?
9.
스타터 의존성
• Springboot는 스타터 의존성 수단으로 프로젝트 의존성을 쉽게 관리.
•org.springframework:spring-core
•org.springframework:srping-web
•org.springframework:spring-webmvc
•Com.fasterxml.jackson.core:jackson-databind
•Org.hibernate:hiber-validator
•org.apache.tomcat.embed:tomcat-embed-core
•org.apche.tomcat.embet:tomcat-embet-el
•org.apache.tomcat.embed:tomcat-embed-logging-juli
= org.srpingframework.boot:spring-boot-starter-web
Rest API Spring MVC 구성
10.
CLI
• Spring boot는spring application을 빠르게 작성 하기 위해서
새로운 방법을 제공.
• CLI는 개발자가 코드에만 집중하게 하여, 코드만 작성해도
application을 개발되어지게 한다.
11.
Actuator
• 작동중인 application내부를 살펴 볼 수 있는 기능을 제공.
• 컨텍스트에 구성된 bean
• 자동구성으로 구성된 것
• 환경 변수, 시스템 프로퍼티, 명령줄 인자
• 구동중인 현재 thread 상태
• 메모리 사용량, 가비지 컬렉션, 데이터 소스 사용량
12.
Spring Initializr
• Springinitializr는 spring boot 프로젝트 구조를 만드는 web
application.
• 기본적인 프로젝트 구조와 코드를 빌드하는데 필요한 메이븐이나 그레이들
빌드 명세를 만든다.
• 제공
• 웹기반 인터페이스 (start.spring.io)
• Spring Tool Suite
• IntelliJ IDEA
• Spring boot CLI
13.
Initializr 기본 구조
•build.gradle: gradle build 명세서, (=pom.xml)
•gradlew : gradle wrapper, 시스템에 gradle 설치 하지 않았으면
Gradle 명령대신에 이스크립트를 사용…
•Application.java : main class
•application.properties : 필요한 구성을 추가하는 프로퍼티.
•ApplicationTest.sjava : Junit Test class
14.
Application.java
@SpringBootApplication //컴포넌트 구성과 자동구성
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
@Configuration
@ComponentScan
@EnableAutoConfiguration
스프링에서 자신만의 조건을구성하는 방법.
Public class JdbcTemplateCondition implements Condition {
try{
context.getClassLoader().loadClass(“org.springframework.jd
bc.core.JdbcTemplate”);
return false;
} catch(Exception e) {
return false;
}
}
Condtion class 사용ㅇ하여 matches 함수를 override.
ClassLoader에 해당 class가 로드가 되었을 경우 처리.
19.
Annotation을 사용하여 조건별자동구성
@Conditional(JdbcTemplateCondition.class)
@Bean
public MyService myService() {
….
}
JdbcTemplateCondition가 class에 있을 경우 Bean 생성.
ReadingListApplication.java
@SpringBootApplication
public class ReadingListApplicationextends WebMvcConfigurerAdapter {
public static void main(String[] args) {
SpringApplication.run(ReadingListApplication.class, args);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("login");
//controller 없이 url path와 view name을 설정
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver>
argumentResolvers) {
argumentResolvers.add(new ReaderHandlerMethodArgumentResolver());
//resolver를 등록하여 controller method에 arguments type의 대한 mapping 을 도와준다.
// 사용하기 위해서는 RequstMappingHanlderAdapter 를 설정해줘야한다.
}
}
38.
ReaderHandlerMethodAgrumentResolver.java
public class RederHandlerMethodArgumentResolverimplements HandlerMethodArgumentResolver {
@Override
//Resolver가 적용가능 한지 검사하는 역할
public boolean supportsParameter(MethodParameter parameter) {
return Reader.class.isAssignableFrom(parameter.getParameterType());
}
@Override
//들어오는 paramater을 이용해서 수정하거나 추가 할 수 있는부분
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer
mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
Authentication auth = (Authentication) webRequest.getUserPrincipal();
return auth != null && auth.getPrincipal() instanceof Reader ? auth.getPrincipal() :
null;
}
}
HandlerMethodArgumentResolver class는 controller로 들어오는 paramater를 수정하거나
공통적으로 추가를 해 줘야 하는 경우 에 사용한다.
39.
ReadingListController.java
@Controller
@RequestMapping("/")
public class ReadingListController{
private ReadingListRepository readingListRepository;
@Autowired
public ReadingListController(ReadingListRepository readingListRepository) {
this.readingListRepository = readingListRepository;
}
@RequestMapping(method=RequestMethod.GET)
public String readerBooks(Reader reader, Model model) { //Reader parameter추가
List<Book> readingList = readingListRepository.findByReader(reader); //reader 객체로 변경
if (readingList != null) {
model.addAttribute("books", readingList);
model.addAttribute("reader", reader);
}
return "readingList";
}
@RequestMapping(method=RequestMethod.POST)
public String addToReadingList(Reader reader, Book book){
book.setReader(reader);
readingListRepository.save(book);
return "redirect:/";
}
}
프로퍼티를 이용하여 외부적으로구성
• 명령줄 인자
• java:comp/env
• JVM 시스템 프로퍼티
• 운영체제의 환경변수
• random.*로 시작 하는 프로퍼티 때문에 생성되는 무작위 값
• 외부에 있는 application.properties, application.yml
• 내부에 있는 application.properties, application.yml
• @PropertySource로 지정된 프로퍼티 소스
• 기본 프로퍼티
우
선
순
위
순
Class 하나에 프로퍼티모으기
@Component
@ConfigurationProperties(“amazon”)
Public class AmazonProperties {
private String amazonId;
public void setAmazonId(String amazonId) {
this.amazonId = amazonId;
}
//생략
}
@ConfigurationProperties “xxx” 접두어가 붙은 프로퍼티 가져와서 주입
49.
HTTP and HTTPS
•그러면 HTTP와 HTTPS를 프로토콜을 동시에 사용 할려면 어떻게 해
야 할까?
• server.port를 하나 더 만들면 될까?
• Spring boot는 단 하나의 포트를 application.properties or
application.yml에 설정 할 수 있다.
TomcatEmbeddedServletContainerFactory
@SpringBootApplication
public class TwoConnectorsApplication{
public Integer port() {
return 8080;
}
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new
TomcatEmbeddedServletContainerFactory();
// Add Connectors in addition to the default connector, e.g. for SSL or AJP
tomcat.addAdditionalTomcatConnectors(createStandardConnector());
return tomcat;
}
private Connector createStandardConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setPort(port());
return connector;
}
}
가장 기본적인 스프링통합 테스트
@RunWith(SpringJUnit4ClassRunner.class)// 스프링 통합 테스트 활성화
@ContextConfiguration(classes = ChoongsApplication.class)
public class ChoongsApplicationTests {
@Autowired
private AddressSercvice addressService;
@Test
public void testSerice(){
Address address = addressService.findByLastName();
aseertEquals(“P”, address.getFirstName());
aseertEquals(“Sherman”, address.getLastName());
aseertEquals(“42 Wallaby Way”, address.getAddressLine1());
aseertEquals(“Syndey”, address.getCity());
aseertEquals(“New South wales”, address.getState());
}
}
56.
@SpringApplicationConfiguration
• @ContextConfiguration은 스프링애플리케이션을 로드는 하지만 완전하게
Spring boot 기능을 완전하게 로드 하지 못한다.
• @SpringApplicationConfiguration을 사용하거나
SpringBootServletInitializer을 사용해야한다.
• 로깅과 외부 프로퍼티, spring boot의 다른기능 활성화
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes=ChoongConfiguration.class)
Public class ChoongServiceTests{
…
}
57.
Controller TEST?
@RequestMapping(method=RequestMethod.POST)
public StringaddToRedingList(Book book){
book.setReader(reader);
redingListRepository.save(book);
return “redirect:/”;
}
//POJO를 이용한 테스트 코드 작성, RequestMappling 무시하면 일반적인 method
@RequestMapping(method=RequestMethod.POST)
public String addToRedingList(Book book){
book.setReader(reader);
redingListRepository.save(book);
return “redirect:/”;
}
* POST로 들어오는 요청에 대한 테스트는 불가능, redirect 되는지 테스트 불가능.
58.
Spring boot에서 제공하는Web test option
• Spring Mock MVC
• Application server를 구동하지 않고, 목 구현체로 테스트
• 웹 통합 테스트.
• 톰캣, 제티 내장 서블릿 컨테이너에서 애플리케이션을 실행 하여 실제 서버
에서 테스트.
• 당연히 테스트 시간이 오래 걸림..
59.
Spring MVC 모킹
•Spring 3.2 부터 제공
• 실제 서블릿 컨테이너에서 컨트롤로를 실행하지 않고, HTTP 요청 가능.
• Mock MVC는 서블릿 컨테이너를 실행 하는 것처럼 보이지만 컨테이너
를 실행 하지 않는다.
• Mock MVC를 설정 하려면 MockMVCBuilders를 사용
60.
MockMVCBuilders
• standaloneSetup()
• 수동으로생성하고 구성한 컨트롤러 1개 이상을 서비스 할 MockMVC를 만든
다.
• Unit test
• webAppContextSetup()
• 컨트롤러 1개 이상 포함하는 spring application Context를 사용하여
MokMVC를 만든다.
• 통합 테스트
Spring Security Configure적용
import static
org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurer
s.springSecurity;
public class MockMVCWebTests5 {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void setup(){
mockMvc =
MockMvcBuilders.webAppContextSetup(context).apply(springSec
urity()).build(); //springSecurity()는 스프링 시큐리티를 활성화 하여
} //mockMvc로 수행하는 모든 요청에 스프링 시큐리티 적용
}