ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링_개념_1
    Spring 2022. 6. 7. 23:54

    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
Designed by Tistory.