코드의 재사용성을 증가시키기 위해 일련의 클래스 묶음이나 뼈대 틀을 제공하는 라이브러리
정형화되어있고 일정 이상의 퀄리티를 보장해주지만 습득에 시간이 걸리고 같은 라이브러리가 아니면 이해하기 어려움
자바용 프로젝트 관리 도구, project object model(POM) XML문서를 통해 해당 프로젝트의 버전 정보 및 라이브러리 정보들을 통합하여 관리하는 프레임워크
다운이 멈추는 경우 삭제하고 다시 받아야 한다
Maven을 사용하면 pom.xml (Project Object Model) 문서에 사용하고자 하는 라이브러리를 등록하여 자동으로 프로젝트에 추가되게 하여 라이브러리 관리의 편리성을 제공한다
자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크
동적인 웹사이트를 개발하기 위한 여러가지 서비스를 제공하고 있으며, 전자정부 표준 프레임워크의 기반 기술로 사용되고 있다
http://spring.io/
https://maven.apache.org/
> apache-maven-3.8.6<localRepository>C:\apache-maven-3.8.6\repository</localRepository>
C:\Program Files\Java\jre1.8.0_144\bin
java 설치 주소 가져와서-vm C:\Program Files\Java\jre1.8.0_144\bin\javaw.exe
추가general > workspace > utf-8
/ general>editors>textEditors>spelling>utf-8
JSON>JSONfiles>utf-8
/ web>cssfiles,jspfiles>utf-8
C:\apache-maven-3.8.6\conf\settings.xml
> repository 뜨는지 확인serve modules without publishing
체크 / http 포트 80 설정http://192.168.10.55/iei/
프로젝트 초기 설정한 kr.or.iei
중 마지막 추가/iei
> /
로 변경maven 폴더에 라이브러리 저장할 폴더 생성
maven 설정파일에서 폴더지정 (conf)
sts.ini에 자바 버전 명시 (-vm)
======================== sts 실행
인코딩 설정(6개), Maven UserSetting, Server-RuntimeEnvuronment(C:\Users\greys\apache-tomcat-8.5.82)
maven 설정 파일 읽기
UTF-8 설정
General
JSON
Web
Maven
Inversion of Control (제어의 역행 )
객체 생성에 대한 생성, 변경 등의 관리를 개발자가 아닌 컨테이너(스프링)에서 직접 관리하는 것, 개발 시간 단축
<스프링으로 객체 만들기>
시작할 때 만들어짐 / 라이브러리로 추가되는 객체
Spring bean configuration > next > beans
<!--
비어있는 Member 객체 생성 후 setter로 값 대입
Member member1 = new Member();
member1.setName("임라떼");
member1.setAge(20);
member1.setAddr("영등포구");
-->
<bean id="member1" class="kr.or.iei.vo.Member">
<property name="name" value="임라떼"/>
<property name="addr" value="서울시 영등포구"/>
<property name="age">
<value type="java.lang.Integer">20</value>
</property>
</bean>
<!--
생성자를 이용하여 객체를 생설하며 데이터를 넣기
Member member2 = new Member("임락데", "30", "서울시 여의도동");
-->
<bean id="member2" class="kr.or.iei.vo.Member" scope="prototype">
<constructor-arg value="이윤수1"/>
<constructor-arg>
<value type="java.lang.Integer">30</value>
</constructor-arg>
<constructor-arg value="부산"/>
</bean>
scope=prototype : 객체를 재사용할 것인지 새로 만들어줄 것인지에 대한 속성
XML 파일에 과도한 설정을 하게 되면 부담
클래스에 어노테이션을 붙여 스캔 범위를 지정한 후 사용할 수 있다
@Component
클래스 위에 component를 붙인다
servlet-context.xml 에서<context:component-scan base-package="kr.or.test"/>
서버는 web.xml을 보면서 실행한다 > appServlet에 servlet-context.xml에 있다고 쓰여있다 > servlet-context에 가보면
<context:component-scan base-package="kr.or.iei" />
해당 태그에 초기에 설정하면서 입력했던 패키지 앞 세 자리가 들어있다
@Controller : component의 세분화 컨트롤러에 지정
@Service : component의 세분화 서비스에 지정
@Repository : component의 세분화 dao에 지정
@Autowired : 프로그램 가동 시 객체를 찾아 연결해 준다
@Inject
@Qualifier
@Reaource
VIEW-Controller-Model-Controller-VIEW
DispatcherServlet : 유일한 servlet 클래스 HTTP프로토콜을 통해 들어오는 요청을 가장 먼저 처리
HandlerMapping : 클라이언트의 요청을 어떤 Controller가 처리할지 Mapping값을 가지고 있다
Controller : 실질적인 클라이언트 요청을 처리
ViewResolver : Controller가 반환한 view 이름으로 실행될 jsp 경로를 가지고 있다
View : 실제 클라이언트에게 보여지는 페이지
<form action="/login.do" method="post">
아이디 : <input type="text" name="memberId"><br>
비밀번호 : <input type="password" name="memberPw"><br>
<input type="submit">
</form>
<hr>
<form action="/search.do" method="get">
조회할 아이디 : <input type="text" name="memberId"><br>
<input type="submit" value="조회">
</form>
2개의 form태그를 만든다
package kr.or.iei.controller;
import javax.servlet.http.HttpServletRequest;
public interface Controller {
public String request(HttpServletRequest request);
}
Controller interface - request를 받아 String으로 돌려주는 추상메서드
package kr.or.iei.controller;
import javax.servlet.http.HttpServletRequest;
public class SearchController implements Controller {
@Override
public String request(HttpServletRequest request) {
// 값추출
String memberId = request.getParameter("memberId");
// 비즈니스로직
// memberId=user01
boolean result = memberId.equals("user01");
// 결과처리
if(result) {
return "searchSuccess";
}else {
return "searchFail";
}
}
}
Controller를 구현한 SearchController
package kr.or.iei.controller;
import javax.servlet.http.HttpServletRequest;
public class LoginController implements Controller {
@Override
public String request(HttpServletRequest request) {
// 값추출이 일어나는 곳
String memberId = request.getParameter("memberId");
String memberPw = request.getParameter("memberPw");
// 비즈니스로직
// 실제 해야 하는 일 = (서비스를 통한 id/pw 검증)
// user01-1234 가상으로 DB 설정
boolean result1 = memberId.equals("user01");
boolean result2 = memberPw.equals("1234");
boolean result = result1 && result2;
// 결과처리
if(result) {
return "loginSuccess";
}else {
return "loginFail";
}
}
}
Controller를 구현한 LoginController
// 인코딩(filter 없으므로)
request.setCharacterEncoding("utf-8");
// 사용자가 요청한 컨트롤러의 주소를 확인한다
String uri = request.getRequestURI(); // dispatcherServlet의 첫번째 역할
System.out.println("사용자 요청 uri : "+uri);
/*
if(uri.equals("/login.do")) {
LoginController controller = new LoginController();
}else if(uri.equals("/search.do")) {
SearchController controller = new SearchController();
}
*/
HandlerMapping mapping = new HandlerMapping();
Controller controller = mapping.getController(uri);
String result = controller.request(request);
// 결과를 처리할 viewResolver
ViewResolver resolver = new ViewResolver();
String view = resolver.getView(result);
response.sendRedirect(view);
DispatcherServlet
web.xml에서 appServlet을 조작한다
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
servlet-context.xml에서 viewResolver를 가져와 사용한다
<!-- view Resolver -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>