본문 바로가기
개발자의 공부방/스프링

스프링 학습 중

by 쌈빡한 쥬니준 2019. 6. 4.

아직 정리하지 않은 글 입니다.



스프링

OOP 구조를 뒷받침하고 구조를 설계하는 사상.

다른 프레임워크들과의 통합을 지원.


ApplicationContex

이 녀석이 필요한 객체들을 생성, 필요한 객체들을 주힙하는 역할을 해주는 구조.

스프링에서는 ApplicationContext가 관리하는 객체를 Bean 이라는 용어로 부름.


빈과 빈 사이의 의존관계

XML, 어노테이션, JAVA로 설정 가능.


AOP

반복적인 코드의 제거

보안, 로그, 트랜잭션 → 횡단관심사 라고 함.

횡단관심사를 모듈로 분리하는 프로그래밍의 패러다임


1) 핵심 비즈니스 로직에만 집중해서 코드를 개발

2) 각 프로젝트마다 다른 관심사를 적용할 때 코드의 수정을 최소화

3) 원하는 관심사의 유지보수가 수월한 코드를 구성


트랜잭션지원



의존성 주입 테스트

1) 생성자를 이용한 주입

2) setter 메서드를 이용한 주입


XML, 어노테이션을 이용해서 처리.



의존성 주입 방법

*1) 태그 방식

2) 어노테이션 방식

*3) Setter 방식

*4) 생성자 방식


- 다른 사람이 작성한 클래스 파일은 1,3,4번과 같은 방식을 사용해야함.





스프링구조

src/main/java → 작성되는 코드의 경로

src/main/resources → 실행할 때 참고하는 기본 경로 (주로 설정 파일들을 넣는다)

src/test/java → 테스트 코드를 넣는 경로

src/test/resources → 테스트 관련 설정 파일 보관 경로


servlet-context.xml → 웹과 관련된 스프링 설정파일

root-context.xml → 스프링 설정파일

web.xml → Tomcat의 web.xml 파일

pom.xml → Maven이 사용하는 pom.xml




@Autowired

- 빈과 빈의 의존성을 자동으로 만족시키게 하는 수단

- 스프링 전용, 타입에 맞춰서 연결 (스프링 외에서는 사용을 못 한다.)


@Inject

- 의존관계를 자동으로 연결해주는 어노테이션

- 위의 Autowired 랑 비슷하지만 다른 어노테이션

- 자바에서 지원, 타입에 맞춰서 연결

- 자바 기존의 어노테이션


@Resource

- 자바에서 지원, 이름으로 연결

- 자바 기존의 어노테이션


@ComponentScan

- java설정을 했을 때 root-context.xml을 대신할 때.

- root-context.xml 을 보면 xml을 읽어오기 위해서

<context:component-scan base-package="org.zerock.sample"></context:component-scan>을 이용.

- 만약에 데이터연동을 xml로 한다면 따로 클래스를 만들어서 할 필요가 없고

- java 로 설정을 하는 경우 - 클래스를 만들어서 데이터연동을 하고 myBatis 설정도 같은 클래스에서 한다.

- xml 로 설정을 하는 경우 - root-context.xml 에서 설정을 한다.



*@Component 와 @Autowired 상관관계.


@Component

- 스프링에게 해당하는 클래스가 스프링에서 관리해야하는 대상임을 표시하는..

- @Component("이름") 마크를 달아놓으면, xml의 빈으로 등록해달라는 표시 id는 기본적으로 클래스면의 첫글자를 소문자로...

- 예를 들어서 Bird 라는 인터페이스를 상속하는 치킨과 팽귄이라는 클래스가 있다고 하자.

- 치킨과 팽귄 클래스를 연결해야하니깐 @Component로 빈에 등록을 해주는 것.


1
2
3
4
5
6
7
8
9
public class Bird{}
 
@Component
public class Chicken implements Bird{}
 
@Component 
public class Penguin implements Bird{}
cs

1
2
3
4
5
6
7
8
9
10
11
@Autowired
private Chicken penguin;  //Chicken 타입으로 연결됩니다.
 
@Inject
private Penguin chicken; //Penguin 타입으로 연결됩니다.
 
@Resource
private Chicken penguin;  //penguin 타입으로 연결됩니다만, Chicken 클래스를 자료형으로 두었기에 캐스팅이 되지 않아 에러가 납니다
 
@Resource
private Bird penguin;      //penguin 타입으로 연결되어 호출해보면 penguin 클래스의 값을 호출하는 것을 볼 수 있습니다.
cs


@Autowired와 @Inject의 경우에도 @Qualifier 어노테이션을 사용하면, 타입 이외의 방법으로도 연결 할 수 있습니다.
1
2
3
@Autowired
@Qualifier("chicken")
pirvate Brid penguin;
cs

위와 같이 쓰면 이름에 상관없이 Chicken 타입으로 연결되는 것을 알 수 있습니다. 이렇게 @Qualifer와 함께 쓰면 더욱 강력한 기능을 쓸 수 있는 장점이 있습니다.


@Configuration

- 해당 클래스의 인스턴스를 이용해서 설정 파일을 대신 하는 역할.


@Log4j [lombok 어노테이션]

- lombok을 이용해서 로그를 기록하는 Logger 를 변수를 생성.

- 별도의 Logger객체의 선언이 필요 없다.

- Log4j와 해당 설정이 완료되는 상태라서 별도의 처리 없이도 사용이 가능.

* @Log4j 는 Log4j가 없다면 @Log 를 이용


@Data [lombok 어노테이션]

- Lombok을 이용한 것

- setter 생성하는 기능과 생성자, toString() 등을 자동으로 생성하도록 하는 어노테이션

- 세부적인 설정을 할 필요가 없다면 Data로


@Setter // @getter [lombok 어노테이션]

- lombok 에서 만들어주는... setter 를 해주는 어노테이션

- up to JDK7:
@Setter(onParam=@__({@AnnotationsGoHere}))}
- from JDK8:
@Setter(onParam_={@AnnotationsGohere})}


@AllArgsConstructor

- 인스턴스 변수로 선언된 모든 것을 파라미터로 받는 생성자를 작성


@NonNull & @RequiredArgsConstructor

- 여러 개의 인스턴스 변수들 중에서 특정한 변수에 대해서만 생성자를 작성할 때.

- @RequiredArgsConstructor는 @NonNull 이나 final이 붙은 인스턴스 변수에 대한 생성자를 만듦.


@ContextConfiguration [테스트 관련 어노테이션, 제일 중요]

- 속성값인 문자열을 설정하는 (즉 root-context경로를 설정해서 그 안의 스프링의 빈을 등록하는 것)

- classpath & file 을 이용할 수 있다.

- XML 뿐만 아니라 JAVA 설정으로도 가능.

- @ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")

- 속성으로는 locations 를 이용


@RunWith [Junit 어노테이션, 테스트 관련 어노테이션]

- 테스트 코드가 스프링을 실행하는 역할을 할 것

- SPringJUnit4ClassRunner 클래스가 대상.


@Test [JUnit 어노테이션, 테스트 관련 어노테이션] 

- JUnit 테스트 대상을 표시하는 어노테이션

- 해당 메서드를 선택하고 JUnit Test 기능을 실행.

- @Test는 junit에서 해당 메서드가 jUnit 상에서 단위 테스트의 대상


- Junit 메서드


객체 A는 (restaurant) 즉, 주체가 되는 객체


assertArrayEquals(a,b) : 배열 a와b가 일치함을 확인 

assertEquals(a,b) : 객체 a와b의 값이 같은지 확인 

assertSame(a,b) : 객체 a와b가 같은 객체임을 확인 

assertTrue(a) : a가 참인지 확인 

assertNotNull(a) : a객체가 null이 아님을 확인 (null이 아니면 테스트가 성공!)


@ModelAttribute

강제로 전달받은 파라미터를 Model에 담아서 전달하는 어노테이션

1
2
3
4
5
6
7
8
@GetMapping("/ex04")
    public String ex04(SampleDTO dto, @ModelAttribute("page"int page) {
        
        log.info("SampleDTO 입니다. >>>>"+dto);
        log.info("페이지 입니다. >>>>"+page);
        
        return "/sample/ex04";
    }
cs



















=== pom.xml ===

------ maven ------


Mybatis-spring

- 마이바티스와 스프링을 연동해주는 모듈


Spring-jdbc/Spring-tx

- 스프링에서 데이터베이스 처리와 트랜잭션 처리(Mybatis 에서 안하면 에러생김)



Tip)

dependency 를 추가할 때 <version>에서 아래와 같이 쓴다면 이것은 스프링프레임워크의 버전에 맞춰서 치환된다.

<version>${spring-framework.version}</version>


<properties>

<java-version>1.8</java-version>

<org.springframework-version>5.0.7.RELEASE</org.springframework-version>

<org.aspectj-version>1.6.10</org.aspectj-version>

<org.slf4j-version>1.6.6</org.slf4j-version>

</properties>





=== root-context.xml ===

------ mybatis ------


MyBatis 에서 가장 핵심적인 객체는 SQLSession 이라는 존재와 SQLSessionFactory 이다.

SQLSessionFactory :  SQLSession 을 만들어내는 존재

SQLSession을 통해서 Connection을 생성하거나 원하는 SQL을 전달하고, 결과를 리턴 받는 구조로 작성한다.


스프링에서 SqlSessionFactory를 등록하는 작업은 SqlSessionFactoryBean을 이용한다.










---- 에러 ----




log4 Junit에러

http://myblog.opendocs.co.kr/archives/1566

댓글0