-
src/main/resources : 설정파일
webapp/resoures : 이미지, js, css 자원에 해당되는 것들 모아놓는 공간홈컨트롤러의 RequestMapping(value="/home.do")이 부분만 변경해서 지정값을 연결해준다.
'/'으로 되어있는 것을 요청에 대해 세분화할것이다 --> web.xml
web.xml
<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>
<url-pattern>*.do</url-pattern> -->home.do의 .do를 처리하는 것을 묶어서 만들어준다.
views/member를 servlet-context.xml에 추가하지않고 controller의 리턴에 member/home처럼
폴더명까지 넣어주면 된다.Spring Bean Difinition file->next->context선택+밑에 버전 4.3가장 높은거로 선택 을 통해 생성한다
xmlns(namespace의 약어)->대표로 사용할 네임스페이스
servlet-context.xml은 mvc, memebr-context.xml은 beans가 대표가 된다.
네임스페이스 안에 대표 OOO을 넣으면 따로 넣지않아도된다.root-context.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Root Context: defines shared resources visible to all other web components --> <!-- DataSource 등록, bean객체생성, destroy-method="close" 닫아주는 메소드를 사용하겠다--> <!-- property태그는 셋터를 통해 값을 집어넣는 방법이다.(매개변수 있는 생성자를 통한게 아님!) --> <bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@localhost:1522:xe"/> <property name="username" value="Spring"/> <property name="password" value="Spring"/> </bean> <!-- SqlSession 빈 등록, 위에 bean태그 id="dataSource"를 참고, 마이바티스컨피그파일도 읽어와야 팩토리 등등읽어옴--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <!-- 매개변수 있는 생성자로 만드는 것이다. constructor-arg class에 있는 템플릿이 매개변수에 있는 생성자로 받아드리기 때문에--> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSession"/> </bean> <!-- ref는 참조이다. --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> </beans>
MemberController
@Controller // Controller역할을 갖는 객체 생성해주는 어노테이션 = 빈(객체)등록 -->DI라고한다.DI(Dependency Injection) : 의존성 주입 public class MemberController { @Autowired private MemberService mService; // @RequestMapping(value="login.me", method = RequestMethod.POST) // public void login() { // System.out.println("로그인 처리"); // } /**파라미터 전송 받기***/ //1. HttpServletRequest방식 : JSP/Servlet방식 // @RequestMapping(value="login.me", method = RequestMethod.POST) // public void login(HttpServletRequest request) { // String id = request.getParameter("id"); // String pwd = request.getParameter("pwd"); // // System.out.println("id1 :" + id); // System.out.println("pwd1 :" + pwd); // } //2. @RequestParam방식 // 스프링에서 좀 더 간단하게 파라미터를 받아올 수 있는 방법 // HttpServletRequest와 비슷하게 request객체를 이용하여 데이터를 전송받으나 원하는 타입으로 자동 형변환 가능 // value view에서 받아올 파라미터 이름, 어노테이션에 들어가는 속성이 하나 뿐이라면 자동으로 value가 인지하여 생략가능 // defaultValue 값이 null이거나 들어오지 않았을 때 기본적으로 들어갈 데이터 지정 // required 해당 파라미터가 필수적인 설정, 기본 값 true, 필수값은 아니고 나중에 사용하려고 미리 만든값 // @RequestMapping(value="login.me", method = RequestMethod.POST) // public void login(@RequestParam("id") String id, @RequestParam("pwd") String pwd) { // public void login(@RequestParam(value="id") String id, @RequestParam(value="pwd") String pwd) { // public void login(@RequestParam(value="id", defaultValue="hello") String id, @RequestParam(value="pwd", defaultValue="world") String pwd) { // public void login(@RequestParam(value="id", defaultValue="hello") String id, // @RequestParam(value="pwd", defaultValue="world") String pwd, // @RequestParam(value="test", required=false, defaultValue="spring") String test) {//존재하지않은 값을 반환받으려할 때 400에러가 뜬다. 나중에는 사용할 수도 있다. // System.out.println("id2 :" + id); // System.out.println("pwd2 :" + pwd); // System.out.println("test :" + test); // } //3. @RequestParam 생략방식 // 매개변수 명이 파라미터 명과 동일해야 mapping //@RequestParam에서 사용할 수 있는 속성 사용 불가 //이왕이면 쓰는게 좋다. 뷰에서 받아오는건지 지금 매개변수 구분인지 쓰는게 좋다 // @RequestMapping(value="login.me", method = RequestMethod.POST) // public void login(String id, String pwd) { // System.out.println("id3 : " + id); // System.out.println("pwd3 : " + pwd); // } //4. @ModelAttribute방식 // 요청 파라미터가 많은 경우 객체 타입으로 넘겨 받음 // 파라미터명이랑 셋터와 이름이 같아야 매핑이 된다. 이름이 다르면 매핑 안됨. 기본생성자 없으면 안됨!! 기본생성자로 객체를 만들어줘야 셋터도 진행된다. // @RequestMapping(value="login.me", method = RequestMethod.POST) // public void login(@ModelAttribute Member m) { // System.out.println("m : " + m); // } //5. @ModelAttribute 생략방식-->추천하지않음 @RequestMapping(value="login.me", method = RequestMethod.POST) public void login(Member m) { //주도권을 우리가 가지게 된다, 객체주소를 찍어볼때 주소가 다르게 나온다=요청할 때마다 new 새롭게 객체를 만들어내기때문에 주소가 다르게 나오는것이다. // MemberService mService = new MemberService();//이름을 바꾸면 변경에대해 직접적인 영향을 받고, 요청을 할때마다 새로운 주소값을 반환한다 ==> 높은 결합도 // System.out.println(mService); Member loginMember = mService.login(m); } }
어노테이션 @Controller
: 어떤 클래스의 메소드를 실행시키려면 클래스를 객체로 만든 후에 메소드 호출시켜야 한다.
멤버컨트롤러를 어떻게 객체화하는지 ->Spring이 멤버컨트롤러를 객체로 만들어주는데 이 실행을 @Controller(어노테이션 컨트롤러)가 해준다.@Controller-->Controller역할을 갖는 객체 생성해주는 어노테이션 = 빈(객체)등록 -->DI라고한다.
***DI(Dependency Injection) : 의존성 주입(프레임워크가 객체를 만들어주는것)
***IoC(Inversion of Control): 제어의 반전 때문에 의존성 주입이 나타난다.
원래 개발자가 주도권을 가졌는데, 스프링은 프레임워크가 주도권(제어의 반전)을 가진다.
2) @RequestParam
Spring안에 멤버컨트롤러객체가 들어가 있다.
@RequestParam=getParameter역할
뷰의 name값 = @RequestParam 받아오고싶은 자료형 그대로 사용할 수 있다--> int
원래 getParameter는 String으로만 넘어와서 Integer.parseInt를 해줬어야됬는데 그렇게 하지않아도된다.존재하지않은 값을 반환받으려할 때 400에러가 뜬다.->나중에 쓸만한 상황이 생길 수 있다.
MemberService mService = new MemberService();
System.out.println(mService);
mService.login(m);
문제1)주도권을 우리가 가지게 된다.
문제2)객체주소를 찍어볼때 주소가 다르게 나온다=요청할 때마다 new 새롭게 객체를 만들어내기때문에 주소가 다르게 나오는것이다.
문제3)서비스 이름을 바꾸면 컨트롤러의 이름도 같이 바뀐다. ==>높은 결합도
**하나가 잘못되면 나머지도 문제가 된다==그렇게때문에 높은 결합도는 좋은 프로그램이 아니다!!이름을 바꾸면 변경에대해 직접적인 영향을 받고, 요청을 할때마다 새로운 주소값을 반환한다 ==> 높은 결합도
-->스프링을 통해서 결합도를 낮출 것이다.해결방법1) 메소드로 만들어준다.
MemberServiceImpl, MemberService를 만들어준다
올바른 해결방안이 아니기때문에 new MemberServiceImpl를 지운다<결합도를 낮춰주기 위한 방법>
프레임워크가 주도권을 가질수 있게 객체 등록한다.
MemberServiceImpl에 @Service를 객체생성한다.-->서비스역할
@Service("mService") 꼭 적어줘야 하는 건 아니지만 어디 꺼를 가져올 건지 확인시켜주기 위함이다.
발생한 주소값을 어디로 넣을건지?? @Autowired 통해 MemberServiceImpl와 Controller를 연결해준다.@Autowired를 통해 @Repository("mDAO") MemberServiceImpl와 MemberDAO를 연결해준다.
인터페이스 껴도되고, 빼고 바로 @Autowired를 통해 연결해도된다.
인터페이스를 빼면 결합도가 높아진다.->구조가 간단해짐.(실무에서는 인터페이스를 많이 사용한다)@Service==>서비스 객체 지정
서비스->인터페이스이다. 객체생성 불가능하다. 상속으로 진행해야 된다.
https://mvnrepository.com/artifact/org.mybatis/mybatis/3.5.6
Usages 사용유저가 많은 곳에서 받아오는게 좋다
Central/Alfresco/ICM저장소
root-context : DB연결구문 작성
bean 객체생성 : 1)xml파일에서 bean태그, 2) @Annotation을 통해 생성
window-preferences-xml-user specified Entries-add
라이브러리 스프링버전과 같은 버전으로 jdbc 다운한다-->5.3.20
파라미터타입 없어도 된다.'Spring' 카테고리의 다른 글
Spring_댓글등록_댓글리스트조회 (0) 2022.06.14 Spring_Ajax_아이디 중복 확인 (0) 2022.06.14 Spring_파일게시글_페이징처리 (0) 2022.06.10 Spring_로그인_암호화 (0) 2022.06.08 스프링_설정 및 기본 구조 (0) 2022.06.04