안드로이드&IOS 앱 개발자 양성

안드로이드&iOS 앱 개발자 양성(59일차)

HRuler 2020. 6. 30. 18:51
더보기

** Spring
1. Spring Project 작업 도구
2. Spring Project 종류
3. Spring Legacy Project
4. pom.xml

** Spring Projectpom.xml
1. properties
2. dependencies
3. Spring MVC Project

** IoC(제어의 역전)
1. Factory Method Pattern
2. Proxy Pattern
3. 인스턴스 생성은 xml 파일이나 어노테이션을 이용해서 생성
4. class는 java 디렉토리에 생성

** IoC 실습
1. domain 패키지에 DTO 클래스를 생성
2. HomeController의 메소드에서 인스턴스를 생성해서 출력

** Factory Method Pattern 적용
1. ItemFactory 클래스 생성, Item 인스턴스를 리턴하는 메소드를 생성
2. HomeController 클래스의 메소드 수정

** SpringIoC 적용
1. appServlet.xml 파일에 작성
2. HomeController 클래스의 코드 수정

** Simple Spring Maven Project
만들기
1. Java Project를 생성
2. Maven Project로 변환 : pom.xml 생성
3. pom.xml에 코드 추가

** SpringIoC(Inversion Of Control)
1. Spring Bean : Spring이 만들어주는 인스턴스
2. Bean Factory

** Configuration을 이용해서 bean 생성
1. domain.Good 클래스를 생성
2. Spring Factory 클래스를 생성
3. main 메소드를 소유한 클래스를 만들고 main 메소드를 작성
4. Spring이 만들어주는 Bean은 기본적으로 Singleton Pattern이 적용된다.
5. 2개의 객체가 동일한 객체인지 확인 - 해시코드 확인

** XML을 이용한 Bean 생성으로 변경
1. src 디렉토리에 SpringBeanConfiguration 파일을 추가
2. Good 클래스의 Bean을 생성하는 코드를 추가
3. main 메소드를 수정

** bean 태그
1. id 속성 : 구분하기 위한 식별자로 설정하지 않으면 클래스이름#0으로 설정된다.
2. class 속성 : 생성할 인스턴스의 클래스 경로를 적는다. - 필수
3. name 속성 : id에 대한 별명인데 특수문자가 가능하다.
4. init-method : 초기화 메소드 이름을 설정한다.
5. destroy-method : 소멸될 때 호출하는 메소드이다.
6. lazy-init : 지연생성 여부로 true 또는 false를 설정
7. scope : 기본 값은 singleton인데 request, session 등을 설정할 수 있다.
8. abstract : 추상 클래스 여부를 설정하는 것인데 기본 값은 false이다.
9. fatory-method : 생성자가 아닌 메소드를 이용해서 인스턴스를 생성할 때 메소드 이름을 설정하는 것

** Spring DI
1. DI(Dependency Injection) : 의존성 주입
2. 의존성 주입을 구현하는 방법
3. Bean에서의 의존성 설정

** DI 실습
1. DTO 클래스로 사용할 domain.Good 클래스 생성
2. DAO 클래스를 생성 - DAO에도 템플릿 메소드 패턴을 적용하기도 함
3. Service 인터페이스를 생성하고 메소드를 선언
4. Service 인터페이스를 implements한 ServiceImpl 클래스를 생성
5. Controller로 사용할 클래스를 생성
6. main 메소드를 소유한 클래스를 생성해서 실행 코드를 작성하고 실행
7. 일반적인 응용프로그램은 위처럼 인스턴스를 직접 생성해서 생성자나 setter를 이용해서 주입하고 사용

** Spring에서의 의존성 주입
1. 생성자를 이용한 주입
2. SpringBeanConfiguration 파일을 추가하고 Good 클래스의 bean을 생성하는 코드를 작성
3. main 메소드에서 위의 bean을 가져와서 사용하는 코드를 작성
4. bean 생성 코드 변경
5. value 대신에 다른 bean의 id를 설정하는 것도 가능
6. Good 클래스의 bean 만드는 코드 수정
7. Property를 이용한 주입
8. Good 클래스의 bean 생성 코드 변경
9. c와 p NameSpace 이용

** Collection Type 설정
1. List
2. Set
3. Map
4. Properties

** annotation을 이용한 IoCDI 설정
1. XML 설정 파일과 Annotation을 혼합해서 사용하고자 하는 경우
2. @Autowired
3. bean을 자동생성해주는 어노테이션
4. Spring Project를 만들어서 작업을 할 때는 하나의 루트 패키지를 만들고 그 안에 세부적인 패키지들을 만들어서 작업을 수행하는 것이 좋다.
5. bean을 생성하는 기본적인 방법과 Controller, Service, Repository, Component를 이용한 Bean 생성과 Autowired를 설정하는 것이 중요하다.

※ Spring

 - Java Framework

 - 대규모 애플리케이션 개발에서 개발자들의 역량을 획일화해서 빠르게 구현할 수 있도록 해주는 것이 목적이다.

 - 이러한 Java Framework로서 이전에는 struts를 많이 사용했다.

 - 일본 같은 경우 struts로 구현된 애플리케이션들을 유지 보수할 때 사용하고 있다.

1. Spring Project 작업 도구

 - Eclipse(Plug In을 이용하는 방법, Spring Tool Suite를 이용하는 방법, 기업이 만든 별도의 프레임워크를 이용하는 방법 - 전자정부 프레임워크·Any Framework...)

 - Intelli J - 개인 개발자나 중소기업 등에서 이용

2. Spring Project 종류

 - Legacy Project : Spring MVC Projet - 이전에 사용하던 Spring Web Project, STS 4 버전 이후부터는 제공되지 않는다. 기존 대기업이나 금융, 공공기관 프로젝트가 이 방식으로 만들어져 있다.

 - Spring Boot Project(Starter Project라고도 함) : 애플리케이션 개발을 빠르게 하기 위해 제공되는 템플릿 - JSP가 아니라 다른 방식으로 출력하고, 자체 WAS를 제공한다.

3. Spring Legacy Project

 - Maven 기반

 - Maven : Build Tool - pom.xml 파일에 프로젝트에 대한 의존성을 설정한다.

 - Source -> Compile(Source 파일을 운영체제나 Virtual Machine이 알아볼 수 있는 코드로 변환 - 문법적인 오류가 있으면 컴파일 실패) -> build(실행 가능하도록 start up 코드나 컴파일된 파일들 사이의 관계를 설정) -> load(메모리에 적재) -> run(실행)

4. pom.xml

 - repositories : 중앙 저장소 이외의 곳에서 다운로드 받고자 할 때 설정하는 것

 - 수업 중에는 Oracle 사용을 할 때만 설정한다.

 - 기업에서는 함부로 설정하면 안된다.

 - dependencies : 외부 라이브러리 사용하고자 할 때 설정하는 것

 - 사용자 계정의 .m2라는 디렉토리를 이용하여 설정한다.

 - 외부 라이브러리 설정을 하려면 m2 디렉토리에 가서 라이브러리가 있는지 확인을 하고 있으면 그 라이브러리를 사용하고, 없으면 repositories에 설정된 곳으로 가보고 그다음 중앙 저장소에 가서 다운로드하여서 사용한다.

 - 제대로 다운로드되지 않는 경우도 있고 일부분만 다운로드되는 경우도 있으므로 m2 디렉터리를 삭제하고 다시 build를 하면 다운로드가 다시 된다.

 - 다른 컴퓨터의 m2 디렉토리를 복사해서 사용해도 된다.

※ Spring Project의 pom.xml

 - 프로젝트를 생성하면 Maven 설정 파일인 pom.xml이 자동으로 생성된다.

1. properties

 - java version은 1.8로 변경

 - spring version을 5.0.7로 변경

 - properties는 자주 사용할 문자열을 하나의 태그로 만들어 둔 것이다.

 - class 안의 static final 상수와 같은 역할을 한다.

2. dependencies

 - 외부 라이브러리를 설정하는 태그

 - scope가 생략되어 있으면 배포할 때 라이브러리도 함께 배포된다.

 - scope에 provided가 있으면 배포할 때 이 라이브러리는 운영환경에 있는 것을 사용한다는 의미이다.

 - scope에 test가 있으면 이 라이브러리는 배포할 때 삭제된다.

3. Spring MVC Project

 - Spring Web Project로 HomeController라고 하는 Controller와 메인화면

※ IoC(제어의 역전)

 - 일반적인 프로그래밍에서는 클래스를 개발자가 만들고 이 클래스의 인스턴스를 생성해서 사용을 한다.

 - 클래스를 만드는 것은 개발자가 하지만 인스턴스 생성이나 관리는 프레임워크가 해버리는데 이러한 형태를 제어의 역전이라고 한다.

 - 대표적인 경우가 Web Programming에서 HttpServlet으로부터 상속받는 클래스를 우리가 디자인하지만 실제 인스턴스를 만들어서 사용하는 것은 WAS(Web Application Server - Web Container : tomcat 9.0)가 한다.

 - 이렇게 하는 이유는 개발자는 비지니스 로직에만 집중하도록 하기 위해서 이다.

1. Factory Method Pattern

 - 생성자를 호출해서 객체를 생성하지 않고 다른 클래스의 메소드를 이용해서 객체를 생성하는 방식이다.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder -> 여기서 인스턴스는 DocumentBuilder 클래스의 메소드를 호출하지 않고 Factory의 메소드를 호출해서 생성한다.

- 이렇게 하는 이유는 만드는 과정이 복잡할 때 만드는 메소드를 직접 호출하는 것보다는 다른 클래스의 메소드를 간단하게 호출해서 생성하는 것이 가독성을 높일 수 있기 때문이다.

2. Proxy Pattern

 - 클래스를 만들면 Framework가 다른 코드를 삽입해서 새로운 클래스를 디자인하고 우리가 사용하도록 만들어주는 패턴을 말한다.

 - 개발자는 자신이 만든 클래스를 사용하는 것처럼 사용하면 된다.

 - 이런 이유로 프레임워크를 이용해서 작업할 때는 final class는 조심해서 생성해야 한다.

3. 인스턴스 생성은 xml 파일이나 어노테이션을 이용해서 생성한다.

4. class는 java 디렉토리에 생성

 - 애플리케이션이 실행될 때 java 디렉토리에 있는 것만 컴파일한다.

 - 클래스가 아닌 것은 아무 디렉토리에나 만들어도 된다.

※ IoC 실습

1. domain 패키지에 DTO 클래스를 생성

2. HomeController의 메소드에서 인스턴스를 생성해서 출력

 - 일반적인 클래스 사용 방법

※ Factory Method Pattern 적용

1. ItemFactory 클래스 생성, Item 인스턴스를 리턴하는 메소드를 생성

2. HomeController의 메소드 수정

※ Spring의 IoC 적용

1. appServlet.xml 파일에 작성

2. HomeController 클래스의 코드 수정

 - 상단에 작성

※ Simple Spring Maven Project 만들기

 - 모레 정도까지 이 방법을 사용하는데 이 방법은 중요하지 않음 : IoC, DI, MyBatis, Hibernate 연동을 웹이 아닌 환경에서 하려고 생성

 - STS에서 위의 프로젝트가 만들어지지 않는 경우

1. Java Project를 생성

2. Maven Project로 변환 : pom.xml 생성

 - 프로젝트를 선택하고 마우스 오른쪽 버튼 클릭 후 [Configure] - [Convert to Maven Project]를 선택

3. pom.xml에 코드 추가

※ Spring의 IoC(Inversion Of Control)

 - 제어의 역전

 - 개발자가 만든 클래스의 제어권을 프레임워크가 가지는 것

 - 인스턴스 생성 및 관리를 개발자가 아닌 프레임워크가 하는 것

 - 목적은 개발자가 비지니스 로직 구현에만 집중하도록 하기 위한 것

1. Spring Bean : Spring이 만들어주는 인스턴스

2. Bean Factory

 - 스프링에서 빈을 생성하고 관리하는 인스턴스

 - 생성방법은 xml 파일을 이용해서 생성할 수 있고, 환경설정 클래스를 만들어서 annotation을 이용해서 생성할 수도 있다.

 - xml 파일도 실제 실행이 될 때는 Spring 클래스로 변환이 되는데 이때 많이 사용되는 클래스는 GenericXmlApplicationContext와 WebApplicationContext이다.

※ Configuration을 이용해서 bean 생성

1. domain.Good 클래스를 생성

2. Spring Factory 클래스를 생성

 - 클래스 위에 @Configuration을 추가해주어야 한다.

 - 인스턴스를 생성해서 리턴하는 메소드 위에는 @Bean을 추가해주어야 한다.

 - 전자정부 프레임워크나 기업의 프레임워크는 기본적인 작업이 수행되도록 프로젝트를 생성해 준다.

 - 설정 내용을 읽지를 못하면 수정을 못한다.

3. main 메소드를 소유한 클래스를 만들고 main 메소드를 작성

 - BeanFactory 클래스를 사용하기 위한 생성방법

AnnotationConfigApplicationContext 변수 = new AnnotationConfigApplicationContext(클래스이름.class);

 - BeanFactroy 클래스의 메소드를 호출하는 방법

변수.getBean(String 메소드이름, 실제 생성될 클래스 이름.class);

 - 메소드 이름을 생략하면 클래스 이름과 일치하는 bean을 생성해주는 메소드를 호출하고 클래스 이름을 생략하면 Object 타입으로 만들어서 리턴하기 때문에 강제 형 변환을 해서 사용

4. Spring이 만들어주는 Bean은 기본적으로 Singleton Pattern이 적용된다.

 - Singleton Pattern : 인스턴스를 1개만 생성할 수 있는 디자인 패턴이다.

 - Spring으로 만든 Application이 실행되는 환경은 Server일 가능성이 높기 때문

 - Server는 특별한 경우가 아니라면 인스턴스를 1개만 생성해서 사용자의 요청을 스레드로 처리한다.

5. 2개의 객체가 동일한 객체인지 확인 - 해시코드 확인

 - 인스턴스의 hashCode() 메소드를 호출하면 안된다.

 - hashCode() 메소드는 재정의해서 사용하라고 제공되는 메소드이기 때문이다.

 - 해시코드는 System 클래스의 메소드를 이용해서 출력한다.

※ XML을 이용한 Bean 생성으로 변경

 - XML을 이용해서 Bean을 생성하고자 할 때는 SprinBeanConfiguration 파일을 추가

 - Bean 생성

<bean class = "bean을 생성할 클래스 경로" id = "아이디" />

 - 설정 파일 불러오기

GenericXmlApplicationContext 변수 = new GenericXmlApplicationContext("설정 파일 경로");

- Bean을 가져오는 자바코드는 이전과 동일 : getBean();

1. src 디렉토리에 SpringBeanConfiguration 파일을 추가

 - applicationContext.xml

2. Good 클래스의 Bean을 생성하는 코드를 추가

3. main 메소드를 수정

※ bean 태그

 - 클래스를 등록해서 인스턴스를 생성하기 위한 태그이다.

1. id 속성 : 구분하기 위한 식별자로 설정하지 않으면 클래스이름#0으로 설정된다.

2. class 속성 : 생성할 인스턴스의 클래스 경로를 적는다. - 필수

3. name 속성 : id에 대한 별명인데 특수문자가 가능하다.

4. init-method : 초기화 메소드 이름을 설정한다.

 - 초기화 내용을 생성자에 작성하지만 직접 인스턴스를 생성하지 않고 컨테이너나 프레임워크가 생성하는 경우에는 별도로 제공되는 초기화 메소드를 이용해서 초기화 내용을 작성한다.

5. destroy-method : 소멸될 때 호출하는 메소드이다.

6. lazy-init : 지연생성 여부로 true 또는 false로 설정

 - 기본값은 false

 - 지연생성은 처음부터 만들어 두는 것이 아니고 처음 사용할 때 만드는 것

 - Server Application은 일반적으로 lazy-init을 하지 않고 Client Application을 만들 때 lazy-init을 사용하낟.

 - SPA(Single Page Application)를 만들 때도 lazy-loading을 고려해야 한다.

7. scope : 기본 값은 singleton인데 request, session 등을 설정할 수 있다.

8. abstract : 추상 클래스 여부를 설정하는 것인데 기본 값은 false이다.

9. factory-method : 생성자가 아닌 메소드를 이용해서 인스턴스를 생성할 때 메소드 이름을 설정하는 것

※ Spring Di

1. DI(Dependency Injection) : 의존성 주입

 - 클래스 내에서 사용하는 다른 클래스의 인스턴스를 클래스 내부에서 직접 생성하지 않고 외부(프레임워크나 컨테이너)에서 만든 것을 대입받아서 사용하는 것이다.

2. 의존성 주입을 구현하는 방법

1) 생성자를 이용하는 방법

2) setter(property) 메소드를 이용하는 방법

 - 사용은 변수를 사용하는 것처럼 보이지만 실제로는 getter와 setter 메소드를 이용하는 것을 property라고 한다.

3. Bean에서의 의존성 설정

1) 생성자를 이용하는 방법

<bean id = "" class = "">

             <constructor-arg value = "값"/>

</bean>

 - 값이 생성자에 대입된다.

 - constructor-arg는 여러 개 사용 가능

 - indx라는 속성을 이용해서 순서를 정해서 대입하는 것이 가능하다.

 - type이라는 속성을 이용해서 값의 자료형도 설정하는 것이 가능하다

 - 설정하지 않으면 기본적으로 String이지만 적당하게 형 변환을 해서 대입된다.

 - class에 매개변수를 대입받는 생성자가 존재해야 한다.

DI 실습

 - DTO, DAO, Service, Controller 클래스를 만들어서 작업을 수행

 - DTO는 DAO나 Service에서 사용한다.

 - DAO는 Service가 사용한다.

 - Service는 Controller가 사용한다.

1. DTO 클래스로 사용할 domain.Good 클래스 생성

2. DAO 클래스를 생성 - DAO에도 템플릿 메소드 패턴을 적용하기도 함

3. Service 인터페이스를 생성하고 메소드를 선언

 - service.GoodService

4. Service 인터페이스를 implements한 ServiceImpl 클래스를 생성

 - service.GoodServiceImpl

5. Controller로 사용할 클래스를 생성

 - controller.GoodController : 하나의 Controller로 전부 처리할 때는 이름을 FrontController라고 하고 여러 개의 Controller로 나눌 때는 서비스이름Controller라고 한다.

6. main 메소드를 소유한 클래스를 생성해서 실행 코드를 작성하고 실행

7. 일반적인 응용프로그램은 위처럼 인스턴스를 직접 생성해서 생성자나 setter를 이용해서 주입하고 사용

※ Spring에서의 의존성 주입

1. 생성자를 이용한 주입

<bean class = "클래스 경로" id = "구별하기 위한 식별자">

          <constructor-arg value = "값"/>

</bean>

 - constructor-arg는 여러 개 설정이 가능하다.

2. SpringBeanConfiguration 파일을 추가하고 Good 클래스의 bean을 생성하는 코드를 작성

3. main 메소드에서 위의 bean을 가져와서 사용하는 코드를 작성

 - 실행 결과 : 매개변수가 없는 생성자를 만들었기 때문에 기본값으로 출력

4. bean 생성 코드 변경

 - 실행 결과 : 생성자를 이용해서 값을 대입했기 때문에 대입한 값이 출력된다.

5. value 대신에 다른 bean의 id를 설정하는 것도 가능

<contructor-arg>

                <ref bean = "다른 bean의 id"/>

</contructor-arg>

6. Good 클래스의 bean 만드는 코드 수정

7. Property를 이용한 주입

<bean class = "" id = "">

               <property name = "프로퍼티이름" value = "값"/>

</bean>

 - 프로퍼티 이름은 변수명이 아니고 setter 메소드에서 set을 제거하고 첫글자를 소문자로 변경한 것이다.

 - value 대신에 ref bean을 사용하는 것이 가능하다.

 

8. Good 클래스의 bean 생성 코드 변경

9. c와 p NameSpace 이용

 - c와 p NameSpace를 추가하면 별도의 태그가 아니라 속성으로 생성자와 프로퍼티를 이용한 주입이 가능하다.

 - bean 태그 안에 p:프로퍼티이름 = "값" 또는 p:프로퍼티이름-ref="다른 bean의 ID"로 설정

 - 생성자를 이용하는 경우면 p 대신에 c를 이용

※ Collection Type 설정

 - List(데이터를 순서대로 연속해서 저장), Set(데이터를 빠르게 조회하기 위해서 인덱스를 생성해서 저장), Map(Dictionary라고도 하는데 key와 Value 쌍으로 데이터를 저장), Properties(Map처럼 Key와 Value를 쌍으로 저장하는데 Key와 Value 모두 String만 가능)

1. List

<list value-type = "요소의 자료형">

            <value>값</value>

            <value>값</value>

            ...

</list>

2. Set

<set value-type="요소의 자료형">

             <value>값</value>

             <value>값</value>

             ...

</set>

3. Map

<map>

           <entry>

                            <key>키</key>

                            <value>값</value>

           </entry>

           <entry key = "키" value = "값"/>

</map>

4. Properties

<props>

            <prop key = "키">값</prop>

            <prop key = "키">값</prop>

            ...

</props>

※ annotation을 이용한 IoC와 DI 설정

1. XML 설정 파일과 Annotation을 혼합해서 사용하고자 하는 경우

 - spring bean configuration 파일에 context 네임스페이스를 추가하고 <context:annotation-config/>를 추가

2. @Autowired

 - 변수 위에 사용하는데 이 어노테이션이 추가되면 자동으로 setter를 생성하고 동일한 자료형의 bean이 있으면 자동 주입된다.

 - 이 어노테이션이 설정되어 있는데 동일한 자료형의 bean이 없으면 예외가 발생 - 주입하는데 실패했다는 메시지가 출력됨

 - @Autowired(required=false)로 설정하면 없어도 예외가 발생하지 않음

 - 동일한 자료형의 bean이 2개 이상 존재한다면 이 경우도 애매모호하다고 예외를 발생시킴

 - @Autowired(name="bean의 id")로 설정하면 id가 일치하는 bean을 주입받는다.

 - 동일한 역할을 수행하는 어노테이션으로 @Inject 그리고 @Resource - java 1.8 버전부터 지원

3. bean을 자동생성해주는 어노테이션

 - spring bean configuration 파일에 <context:component-scan="패키지이름"/>을 설정하면 패키지이름에 해당하는 모든 하위 패키지에서 @Component, @Repository, @Service, @Controller 라는 어노테이션이 붙은 클래스의 bean을 자동생성한다.

 - 패키지 이름은 여러 개 사용 가능

4. Spring Project를 만들어서 작업을 할 때는 하나의 루트 패키지를 만들고 그 안에 세부적인 패키지들을 만들어서 작업을 수행하는 것이 좋다.

5. bean을 생성하는 기본적인 방법과 Controller, Service, Repository, Component를 이용한 Bean 생성과 Autowired를 설정하는 것이 가장 중요하다.