Spring

제이·2023년 6월 5일
0
post-thumbnail

정리

  • root-context.xml : (di관련 설정파일)
    하는 일: 빈태그를 사용해서 빈으로 등록하는 거.
  • servlet-context.xml : (spring mvc관련설정파일)
    하는 일 : context:component-scan base-package, resources mapping

빈을 생성!

  • 어노테이션은 interface로 만들어지며 상속관계를 가질 수 있다!
    - @Component : 빈으로 등록. 클래스 위에 적기.(어노테이션으로 빈생성)
    @Component는 servlet-context.xml의 <context:component-scan base-package>에서 처리한다.

밑은 component상속을 받는 것들.

  • @Controller : Component 의미 + 컨트롤러로 사용
  • @Service : Component 의미 + 커맨트 객체와 같은 역할
  • @Repository : Component 의미 + DAO 클래스 역할

component 상속받음

  • @Configuration : 이렇게 적으면 중복된 객체가 적혀도 객체가 하나만 읽혀진다. component보다 이걸 더 사용함.
  • @Bean 과 같이 쓰이는 듯.

빈을 사용!

  • @Autowired : 객체를 직접 만들지 않아도 스프링이 만들어준다.
    내가 전에 만들어 놓은 객체를 들고와서 @autowired만 적으면 알아서 연결해준다. <context:component-scan>을 얘도 해야하는 듯.
    멤버변수 위에 @autowired 적기.
  • @Qualifier("id이름")
  • @RequestMapping
    요청이 들어왔을 때 어떤 컨트롤러가 호출되어야 하는 지 알려주는 거.

스프링 구조

  1. 모든 요청을 서블릿이 다 받게 만들어져있음.
  2. 핸들러매핑: 어떤 컨트롤러를 쓰면 된다고 알려줌. 요청이 이걸로 들어오면 어떤 놈이 담당하는 걸 알려줌. cmdFactory 안에 있는 hashtable 역할.
  3. 컨트롤러 : 일을 하는 게 아니라, 로직을 담다하는 객체한테 일해라고 시키고, 일의 결과에 맞춰서 어떤jsp로 가야하는 지에 대한 정보를 알려줌. action()했던 부분.
  4. 뷰리졸브 : prefix : 앞에 뭔가를 붙이는 역할 - 접두사느낌. suffix : 접미사
    이거는 우리 .jsp붙이는 역할했던 걔다. 우리가 만들지 않는다.
  5. 서블릿이 다시 받아서 forward시킨다.

서블릿이 먼저 받아서 컨트롤을 찾기 위해서 핸들러매핑으로 보내. 어노테이션 리퀘스트매핑을 기준으로 컨트롤러를 찾아. 매핑이 컨트롤러 찾으면 서블릿에 다시 컨

@controller(componemt): 객체를 저장하기 위한것.
@requestMapping() : 얘가 기준이다. 이 스프링이 돌아가는 곳이다.


@Controller
public class HomeController {

@RequestMapping(value = "/", method = RequestMethod.GET)	
//루트로 get방식 요청이 들어오면 들어오면 밑의 home이라는 메서드를 호출하겠다는 뜻. 
	public String home() {
		//여기서 실제로 할 일을 한다.
		//cmd.action(...);
		//문자열로 리턴하는데 그걸 뷰리졸브가 받는다. 문자열 home을 리턴한다. 
		
		return "home";
	}	
}

우리가 만들어야 하는거.

jsp, controller, 서비스 객체(커맨드 객체), dao만 하면 된다.

bean은 이렇게 생긴거라는 스펙이고 dto는 무슨 목적으로 사용되는지 말하는거....

그 전에는 규칙을 인터페이스로 했는데, 스프링에서는 어노테이션을 통해서 한다. 그래서 메서드 정보에 대해서 자유롭다.


프레임워크와 라이브러리의 차이점

  • IOC : 제어의 역전. 누가 제어를 하는가. 이 프로그램을 어떻게 사용 되는가를 결정. 프레임워크가 자체적인 룰을 가지고 있다. 이게 일어나면 프레임워크. 이게 없으면 라이브러리.
  • 프레임워크 : 개발자가 규칙을 정하는 게 아니라 프레임워크가 결정. 쓰는 방식이 정해져있다. 너 이거 쓰고 싶지 bean으로 등록해! 이런 느낌.
  • 라이브러리 : 들고 와서 어떻게 쓸 건지 개발자인 내가 결정해야 되는 거. 진짜 스프링은 Maven Dependencies다.

DI(의존성 주입)

의존성 주입(Dependency Injection, DI)은 객체 간의 의존 관계를 느슨하게 만들기 위해 사용되는 소프트웨어 디자인 패턴.
의존성이란 한 객체가 다른 객체를 사용하거나 참조하는 관계를 말하며, 의존성 주입은 이러한 의존 관계를 외부에서 객체에 주입하여 객체 간의 결합도를 낮추는 방법이다.

의존성 : 내가 필요로 하는거 -> 의존을 가지고 있다.

하나를 고치면 다른 것을 고쳐야 한다 -> 대표적인 예시가 멤버변수. 객체를 구성하고 있는 정보. -> 그래서 @Autowired를 붙여서 의존성을 낮춰주는 듯.

bean(스프링이 관리하는 객체) 중에서 찾아서 알아서 처리해준다. : DI
내가 코드로 관리하는 게 아니라, 의존성을 스프링이 관리한다.

bean

스프링이 관리하는 객체를 bean이라고 한다.
빈으로 등록한 객체들은 싱글톤패턴으로 사용된다.

뭐가 bean이 될 수 있는가? 빈생성 3가지 방법

1.xml
2.어노테이션
3.자바코드로 설정

하트 필요해~ 하는게 autowired
하트가 근데 2개야. -> 이럴 때 노랑 하트가 필요해~ 라고 하기. 그럴 때 쓰는 게 id. qualifier().
똑같은 게 여러개 등록되지 않는다. 같은 객체를 빈에 여러개 등록못한다!

1.xml(root-context.xml)

xml 방식을 통해서만 같은 타입의 Bean 객체를 여러개 만들 수 있다.

root-context.xml
<bean id="some1" class="org.green.first.Some"/>라고 적어주면

요로코롬 위에 S가 붙음 이말은 Spring이 관리를 한다는 뜻.
-> 홈컨트롤러의 의존성이 발생. 홈컨트롤러는 Some이 필요해. 그래서 스프링한테 니가 알아서 만드러서 니가 넣어줘한다.
id는 식별자.

@Autowired이걸 붙여주면 자동연결.
이런걸 di(의존성 주입)라고 한다.

scope
singleton (기본값) : Bean 객체는 유일.
prototype : 매번 새로 생성
request : request마다 빈 생성
session : session마다 빈 생성


2.어노테이션

@Component를 붙이면 된다 - 우리가 만든 클래스에는 이걸 붙이면 된다.
우리가 만들지 않은 클래스는 이걸 붙이지 못한다. 그럴때는 xml로 등록.
같은 타입의 객체를 여러개 등록하는 것은 어노테이션은 안된다. 그럴때는 xml로 해야한다.

ISome를 상속받는 클래스가 두개가 된다. 실행하면 오류가 뜬다.-> 니가 원하는 게 뭔지 찾을 수 없다.
이렇게 되면 어떻게 해야하나?
타입으로 찾는다. 내가 보유하고 있는 빈들 중에서 이 타입으로 표시할 수 있는 애들이 누구냐. -> 해결 방법(아무거나 쓰기)

해결방법

  • xml : 변수이름을 바꿈(some1=root뭐시기에 등록할 때 해놓은 id로 맞춰주기!)

  • 어노테이션: 클래스의 첫글자를 소문자로 바꾼게 id가 된다.
    만들 필요는 없지만, 어노테이션 만들 때 인터페이스로 만든다.
    그래서 인터페이스의 성질을 그대로 가진다.
    @Component를 상속받은 것 중에 하나가 @Controller.
    그래서 빈으로 등록도 되지만 controller성질도 가진다.

    @Component를 상속받은 것 : @Controller, Service, Repository.
    빈으로 등록되지만, 컨트롤러 성질,
    실제 로직을 풀어나가는 service,
    repository는 dao클래스느낌.

  • @Autowired
    @Qualifier("some1")
    private ISome s;

:이렇게 잡아넣으면 id가 some1번인놈을 찾아서 해준다.

  • @Component("myObj") 이러면 강제로 id를 정해줄 수 있다.

  • list, set, map도 xml에 정의가 가능하다!

  • 기본생성자

<bean id="some1" class="org.green.first.Some"/>	
  • 파라미터 한개 받는 생성자
<bean id="some2" class="org.green.first.Some">
<constructor-arg value="custom" />
</bean>
  • 파라미터 2개 받는 생성자
<bean id="some3" class="org.green.first.Some">
<constructor-arg value="7"/>
<constructor-arg value="custom" />	
</bean>
  • 세터를 이용해서 빈을 등록하는 방법
    세터이용해서 값을 정의 할 수 있다.
<bean id="some4" class="org.green.first.Some">
		<property name="data" value="using setter"/>
	</bean>

  • 이렇게 index넣으면 순서를 바꿔도 인덱스순으로 인식한다.
<!-- id가 zealot1인 객체를 빈으로 등록하라. 단,생성자를 통해 이름은 "zealot1", 체력은 120으로 설정한다. -->
<bean id="zealot1" class="org.green.second.Zealot">
		<constructor-arg value="120" index="1"/>
		<constructor-arg value="zealot1" index="0"/>
</bean>

@Component는 servlet-context.xml의 <context:component-scan>에서 처리한다.
context:component-scan base-package="패키지명"
: 클래스에 @Component를 적으면 여기 적힌 scan부분을 통해서 스프링객체로 바뀐다!!

<context:component-scan base-package="org.green.second" />
만약 org.green.second와 패키지가 다르면 스프링에 안들어간다
저 패키지안에 만든 것에만 찾는다.
다른 패키지를 만들어서 사용하려고 한다면, 또 만들기.

빈에 올라가는 순서

1.빈등록할 때 순서 root-context.xml에 있는게 먼저 올라간다.
2.@Component가 올라간다.
그래서 root-context에 <bean으로 a객체를 정의해주고> @어노테이션을 사용해서 a객체를 만들고 <bean안에 있는 것을 삭제하면> a라는 객체는 만들어지지 않은 상태가 된다.


3. javacode

@Bean
bean으로 등록된 메소드는 리턴으로 등록되고 id는 메소드 이름임.
아래 코드를 보면, Some이라는 값이 class이고, id로 some1st를 사용한 것이다. bean으로 다시 적어보면 아래와 갔다.
<bean id = some1st class="org.green.second.Some>
이런 식으로 javacode로 만들면, 한 클래스에 여러개의 객체를 만들 수 있다. 메서드이름을 다르게 설정해주면 되니까.

@Bean
	public Some some1st() {
		return new Some();
	}
@Bean
	public Some some2nd() {
		return new Some(100);
	}

@Configuration

@Component대신에 @Configuration를 쓴다.
이걸 쓰면 같은 객체를 2개 만들지 않는다.
이전에 있던 것을 사용해서 다음 사용된 것에 넣어준다.
@Component를 상속받은 어노테이션이다.

위의 사진을 보면, @configuration은 BeanMaker라는 객체를 생성한 것이고, bean은 Some이라는 객체를 생성한 것이다.


maven - 프로젝트 형상관리 도구

이 maven이 pom.xml의 dependencies에 작성된 라이브러리를 관리해준다.
https://velog.io/@j_code/Spring (<- 참고하기)

그냥 CGLib에서 maven부분의 글을 복사해서 위에 <dependency>부분을 depedencies위에 넣게 되면, 따로 다운을 받아서 넣지 않아도 라이브러리에서 알아서 CGLib를 관리해준다! 아래 사진참고.


webapp - resources

<script src="/res/test.js"></script>
resources안에 있어서 경로의 이름들 다 적어야 되는데, res까지만 적음. res가 resources를 나타냄. 이걸 어떻게 알 수 있나?
이걸 servlet-context.xml에서 정해준다.
resources mapping으로 res라고 애칭으로 정해져준다음에 그 다음에 오는 경로를 나타낸다.


경로를 resources -> /resources/some/js/ 로 바꾸게 되었다.
근데 저 위에 처럼 사용하면, 코드를 바꾸지 않아도 된다.
이렇게 하면 jsp에 쓴 코드를 바꾸지 않아도 된다. 그냥 이 servlet만 바꾸면 된다.

<annotation-driven/><context:component-scan>은 짝이다.
은 servlet-context.xml에 annotation 기반으로 움직일 것 정의(bean 찾으라는 의미도 포함)

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />

spring JDBC

JDBC란?
java프로그램과 DBMS(Mysql,오라클 같은거)간의 통신을 중간에서 번역해주는 역할.- 데이터를 주고 받을 수 있도록 해주는 거.
MYBatis와 같은 거라고 보면 된다.
Connection, Statement, ResultSet을 JDBC가 제공을 해준다.

https://mvnrepository.com/ 에서 Spring Jdbc 다운 받아서 넣기. 그때 이클립스 버전을 같은 걸 넣어야 되는데, pom.xml에
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>부분 확인하고 맞는 버전을 넣기.

JdbcTemplate

jdbcTemplate으로 dao를 만든다. 그 전엔 dbcp로 만들었음.

  • 메서드
    query()
    update()

    를 사용해서 crud를 하는 것 같음.

rowMapper

RowMapper는 Spring JDBC에서 사용되는 인터페이스로, 데이터베이스 결과셋의 각 행(row)을 객체로 매핑하는 역할을 한다.

dao안에 쓰임. 매핑을 하는 놈인듯.
매핑작업은 데이터베이스는 테이블 형태로 저장이 되는데, 그걸 어플리케이션에 사용하기 위한 객체로 사용하는 것을 말함.

private RowMapper<Phone> phoneMapper;
라고 쓰면, 이 자체로 Phone객체가 되는 것 같음.
데이터베이스에 저장된 Phone객체 정보를 들고온 느낌.


Controller → Service → DAO의 순서로 진행
즉, Controller는 클라이언트의 요청을 받고 필요한 데이터 검증 및 가공, 비즈니스 로직의 호출을 담당하며, Service는 비즈니스 로직을 구현하는 역할을 합니다. DAO는 데이터베이스와의 상호작용을 담당하여 데이터의 저장, 조회 등을 처리합니다.


컨트롤러에다가

profile
Hello :)

0개의 댓글