.Java Collection Framework Injection (자바 컬렉션 주입)

----------------------------------------------------------------------------------------

- 빈을 정의할 때 주입해야 하는 멤버가 컬렉션인 경우에 컬렉션이 관리해야할 객체를 초기에 설정할 수 있습니다.

- List, Map(k, v), set, Property를 사용합니다.

 

- Collection(순서나 집합적인 저장공간(

   1)List : 순서가 있는 저장공간, 데이터의 중복 허용

     Stack : LIFO, FILO : 고정적인 메모리 크기를 지닌다.

     Vector(100, 10) : 가변적인 메모리 크기, 동기화 보장, 잘 쓰이지 않음

     ArrayList : 아주 큰 데이터 저장공간, 동기화 보장 X, 속도가 빠르고 크기를 마음대로 조정가능

                   단방향 구조이므로 순차적인 접근이 가능 합니다.

     LinkedList : 양방향 구조, 삽입과 삭제가 아주 용이 합니다.

                     Stack, queue, Deque 만들기 위한 용도로 사용합니다.

                     운영체제 개발, C#, .NET

   2) Set : 순서의 개념이 없고, 데이터 중복 허용 X

       HashSet : 대표적인 클래스, 가장 빠른 접근속도, 순서를 전혀 예층 불가능

       LinkedHashSet : 추가된 순서 또는 가장 최근에 접근한 순서대로 접근 가능

       TreeSet : 정렬된 순서대로 보관하며, 정렬 방법을 지정할 수 있다.

       SortedSet : 정렬

   

  3) Map(key, value)

      key는 중복 허용 X , value는 중복 허용

      Hshtable : 동기화 보장, HashMap보다 느리지만 동기화가 지원된다.

                    키와 값으로 null이 허용되지 않음.

      HashMap : 동기화 보장, TreeSet

                     Map 인터페이스를 구현하기 위하여 해쉬테이블을 사용한 클래스

                     중복허용하지 않고, 순서도 보장하지 않습니다.

                     키와 값으로 null이 허용 됩니다.

      TreeMap : 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장

                    정렬된 순서로 키와 값을 저장하므로 빠른 검색이 가능합니다.

                    그러나, 저장시에는 오름차순을 하기 때문에 저장시간이 다소 오래 걸립니다.

 

      LinkedHashMap : HashMap을 상속 받습니다.

            Map에 있는 Entry들의 연결 리스트를 유지 하므로 입력한 순서대로 반복이 가능합니다.

 

      SortedMap : 정렬(TreeMap)

 

  4) Property : Spring 3.X 사용

      Hashtable 의 상속을 받아 구현

      해쉬테이블은 키와 값(Object, Object)으로 저장

      프로퍼티는  (String, String)형태로 저장

      주로 애플리케이션의 환경설정과 관련한 속성을 저장하는데 사용

      데이터를 파일로부터 일고 쓰는데 편리한 기능 제공합니다.

 

 

'코딩이야기 > JAVA' 카테고리의 다른 글

POJO 란 무엇인가?  (0) 2021.02.16
Callable 비동기 삽질 방지  (0) 2021.01.26
[JSP&Servlet]  (0) 2020.05.28
[JAVA]입출력  (0) 2020.05.01
[JAVA] 람다식  (0) 2020.04.29

.DI(Dependency injection) : Setter&Getter 메소드 주입

-----------------------------------------------------------------------------

- 객체지향 디자인 원칙에서 객체간의 결합도는 약할수록 좋습니다.

- DI는 객체간의 결합도를 약하게 만들어 줍니다.

- DI : 각 클래스간의 의존관계를 빈 설정 정보(beans.xml)를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말합니다.

- 그래서, 개발자들은 단지 빈 설정파일에서 의존관계가 필요하다는 정보를 추가해주면 됩니다.

- 객체의 레퍼런스를 컨테이너로부터 주입받아서, 실행시에 동적으로 의존관계가 생성되어 처리됩니다.

- 컨테이너가 흐름의 주체가 되어서 애플리케이션 코드에 의존관계를 주입해주는 것입니다.

- 장점 : 코드가 단순해지고, 컴포넌트간의 결합도가 낮아집니다.

 

- Setter Injection : 의존성 입력 받는 Setter 메소드를 만들고 이를 통하여 의존성을 주입합니다.

beans.xml

-----------------------------

<bean id="t1" class="kr.co.ezen.beans.TestBean">

      <property name="data1" value="100"/>

      <property name="data2" value="100.1234"/>

      <property name="data3" value="true"/>

      <property name="data4" value="반갑습니다."/>

      <property name="data5" ref="data_bean"/>

</beans>

 

- Constructor Injection : 필요한 의존성을 포함한 클래스의 생성자를 만들고 이를 통하여 의존성을 주입합니다.

- Method Injection : 의존성을 입력 받는 일반 메소드를 만들고 이를 통하여 의존성을 주입합니다.

 

어노테이션? 

생성자와 메소드 차이

 

 

 

.IoC 컨테이너(역제어)
-Inversion of Control : 개발자가 코드 등의 흐름이나 객체 생성에 관련된 코드를 프로그래밍에 직접
작성하는 것이 아니라, 프레임워크가 사용하는 파일에 작성하여 이를 토대로 프레임워크가 객체를 성생하고,
반환하고, 코드가 동작하는 순서를 결정하는 것을 의미합니다

-객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권을 가진다.

-IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리합니다
-POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가지게 됩니다
-개발자들이 직접 POJO를 생성 할 수 있지만, 컨테이너에게 맡기빈다.(Bean등록 -> xml파일)

-2가지 표현
1.의존성 건색 : DL(일반적인 데이터 처리, DataBase 연결)

2.의존성 주입: DI => Setter Injection, Constructor Injection, method Injection
각 클래스간에 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 줍니다.

-종류
1)BeanFactory: 3.x주로 사용
-클래스를 통하여 객체를 생성하고, 이를 전달합니다
-상속 등 객체간의 관계를 형성하고 관리합니다.
-xmlBeanFactory

2)ApplicationContext
-클래스를 통하여 객체를 생성하고, 이를 전달합니다.
-상속 등 객체간의 관계를 형성하고 관리합니다
-국제화 지원 등 문자열에 대한 다양한 기능을 제공합니다
-리스너로 등록되어 있는 Bean에 이벤틀를 발생할 수 있다
-Bean에 관련한 성정을 위한 xml 파일은 즉시 로딩되어서 객체를 미리 생성하여 가지게 됩니다

-ClassPathXmlApplicationContext:xml
-FileSystemXmlApplicationContext
-xmlWebApplicationContext

Spring Bean 객체 생성하기
-spring에서는 사용할 Bean객체를 Bean configuration file에 정의하고, 필요할때마다
객체를 가져와서 사용합니다
-Bean태그: 사용할 Bean을 정의하는 태그
1)class: 객체를 생성하기 위하여 사용하는 클래스를 지정합니다(패키지명.클래스명)
2)id: Bean객체를 가져오기 위하여 사용하는 이름 지정합니다 (t1, t2 ...)
3)lazy-init: singleton인 경우에는 xml을 로딩할 때 객체생성 여부가 결정됩니다
      true: xml 로딩 시에 객체를 생성하지않고, 객체를 가져올 때 생성합니다
4)scope: 객체의 범위를 설정합니다.
   -singleton: 객체를 하나만 생성하여 사용합니다.
   -prototype: 객체를 가져올 때마다 객체를 생성합니다.

 

.DI(Dependency Injection)


1)베터리 일체형: ex) 베터리가 떨어지면 장난감을 새로 구입합니다
public class CarToy{
   private Battery battery;
   public CarToy(){
      battery = new NomalBattery();
   }
}
2)베터리 분리형: ex) 베터리가 떨어지면 베터리를 교체합니다
public class CarToy{
   private Battery battery;
   public CarToy(){
      
   }
   public void setBattery(Battery battery){
      this.battery = battery;
   }
}
2-1)의미적으로는 배터리가 떨어지면 배터리만 교체합니다.라는 의미이지만 약간의 차이가 있다.
public class CarToy{
   private Battery battery;
   public CarToy(){
      this.battery = battery;
   }
   public void setBattery(Battery battery){
      this.battery = battery;
   }
}

 

.DI 설정(생성자)

 public StudentRegisterService(StudentDao studentDao){

    this.studentDao = studentDao;

}

 

<bean id="studentDao" class="ezen.member.dao.studentDao/>

=>    <bean id="registerService" class="ezen.member.service.StudentRegisterService>

        <constructor-arg ref="studentDao"></constructor-arg>

        </bean>

 

 public StudentModifyService(StudentDao studentDao){

    this.studentDao = studentDao;

}

<bean id="studentDao" class="ezen.member.dao.studentDao/>

=>    <bean id="modifySerivce" class="ezen.member.service.StudentModifyService>

          <constructor-arg ref="studentDao"></constructor-arg>

          </bean>

 

 public StudentDeleteService(StudentDao studentDao){

    this.studentDao = studentDao;

}

<bean id="studentDao" class="ezen.member.dao.studentDao/>

=>   <bean id="deleteSerivce" class="ezen.member.service.StudentDeleteService>

        <constructor-arg ref="studentDao"></constructor-arg>

         </bean>

 

 

 public StudentSelectService(StudentDao studentDao){

    this.studentDao = studentDao;

}

 

=> <bean id="selectService" class="ezen.member.service.StudentSelectService>

        <constructor-arg ref="studentDao"></constructor-arg>

         </bean>

 

 

 

 public StudentAllSelectService(StudentDao studentDao){

    this.studentDao = studentDao;

}

 

=>  <bean id="AllSelectService" class="ezen.member.service.StudentAllSelectService>

        <constructor-arg ref="studentDao"></constructor-arg>

         </bean>

 

 

 

 

생성자 객체 주입


1. 의존성 주입은 스프링에서 아주 중요한 개념이며, 장점이 되는 부분입니다.

2. 빈(~.xml) 객체 생성할때, 빈 객체가 관리할 값이나 객체를 주입하는 것을 말합니다.

3. 빈 객체 생성 | 이후에는 빈 객체가 가질 기본적인 값을 자바 코드로 설정하는 것이 아니고, 빈을 정의 하는 xml 코드에서 정의하여 사용하는 것을 말합니다.

4. 빈을 정의할때 constructor-arg 태그를 이용하여 주입하면, 생성자를 통해 주입이 가능합니다.

[Sample 예제]

      <bean id ="t1" class ="kr.co.ezen.beans.TestBean">

          <constructor-arg value="100" type="int" index="2"/>

          <constructor-arg value="str" type="String" index="2"/>

          <constructor-arg value="100" type="int" index="2"/>

      </bean>

 

      <bean id="data" class="kr.co.ezen.beans.TestData" scope="prototype" />

      

      <bean id="t2" class="kr.co.ezen.beans.TestBean2">

      <constructor-arg ref="data" />

      <constructor-arg ref="data" />

      </bean>

 

 

 

 

 

 

5. 생성자 주입에는 다음과 같은 옵션이 존재합니다.

 - value : 기본 자료형 값과 문자열의 값을 설정합니다.

 - type : 저장할 데이터의 타입

 - ref : 객체를 설정

 - index : 지정된 값을 주입할 생성자의 매개변수의 인덱스 번호

 

 

 

 

 

 

'코딩이야기 > Spring' 카테고리의 다른 글

[Spring]AOP Interceptor  (1) 2020.07.10
[Spring]Execution  (0) 2020.07.06
[spring]AspectJ  (0) 2020.07.06
[Spring] 어노테이션 정리  (0) 2020.07.01
[Spring] 자동주입  (0) 2020.06.30

안녕하세요!!!!!!! 이번에 설치해볼것은 Transmission이라는 프로그램인데요!! 

이게 어디에 필요하냐! 바로 토렌트를 사용할때 유용한 프로그램입니다. 비디오 스테이션을 이용해도 되지만 이것을 이용하는게 더 편한다고 해서 설치해보려고 합니다. 

 

우선! 저의 환경을 말씀해 드리면 저는 DS-218+를 사용중에 있구요! 2베이중 1번째에 4TB하드를 2번째에는 320GB 남는 하드를 장착했습니다.

 

토렌트는 배포시에 하드에 무리가 가기 때문에 집에서 남는 하드를 장착하여 이곳에 토렌트를 다운로드 받고 받은 영상을 크론탭등을 이용해서 video로 옮겨서 비디오 스테이션에서 볼수 있도록 설정할 예정입니다.!

 

 

이렇게 폴더를 만들어주었습니다. 이름은 다르게 해도 상관은 없구요!

 

이제 미션을 설치해볼건데요 그전에 패키지센터-설정-신뢰수준 을 모든 게시자로 변경해줍니다.

 

패키지센터-설정-패키지 소스-추가

이름 : 아무거나

위치 : http://packages.synocommunity.com

 

위에 처럼 설치가 완료가 되면 아래처럼 커뮤니티 가 생성되고 내리다 보면 Transmission이라는 프로그램이 보이게 됩니다. 이를 설치하면 되는데요 설치시 권한문제 때문인지 안되더라구요 반드시 권한을 부여하거나

admin으로 접속을 해야 설치가 가능합니다.

 

아까 처음에 설정한 폴더경로를 잡아줄건데요! 저는 볼륨2에 폴더를 생성해서

Download directory : /volume2/torrent/downloads

Watch directory : /volume2/torrent/downloads/watch

Incomplete directory : /volume2/torrent/downloads/incomple

요렇게 설정하고 다음을 눌러 설치를 이어가겠습니다.!

 

다음 컨트롤할 ID와 PW를 입력하는데요! 임의로 원하는 계정을 적은뒤 다음 -다음을 눌러줍니다.

 

 

적용을 눌러 설치를 끝내줍니다. 그럼 아래처럼 설치가 완료가 됩니다.!!

 

포트포워딩 9091

 

 

 

 

 

자 저렇게 설치가 완료되지만 실제로 사용을 하려고 토렌트를 넣어도 실행되지 않습니다. 권한 읽기쓰기에 문제가 있는데요!!!

 

SSH or note pad 없이 GUI 로 설정하는 방법을 알려드리겠습니다.

-File Station-자신이 설정한 다운로드 폴더 우클릭-속성-권한- 생성

위에 경로처럼 따라가면 밑에 사진처럼 나오게 됩니다. 정상적으로 설치가 완료 되었다면 sc-download가 있습니다.

생성을 클릭하고  사용자 또는 그룹 에서 sc-transmission을 선택해줍니다.

해당 사용자가 없다면 설치에 문제가 있는것이기에 다시 설치하시면 됩니다.

선택하고 권한에서 읽기,쓰기를 선택해야 합니다. 꼭!!!!!!!! 확인!

 

요로코롬 하면 정상적으로 설치가 완료되고 사용이 가능합니다. 패키지센터에 가서 Transmission 실행을 한번 눌러준뒤 사용하시면 됩니다.!

'IOT > Synology' 카테고리의 다른 글

[Synology]초기 네트워크 설정  (1) 2020.06.01

 

안녕하세요. 이번에는 시놀로지 설정을 시작으로 hassio(IOT)설정 까지 해보려고 합니다. 

 

천천히 따라오시면 손쉽게 할수 있도록 초보자에게 맟추어 쓸 예정입니다.

제가 초보자라서....

 

우선 고정 IP설정먼저 하겠습니다. 고정IP를 사용하는 이유는 NAS를 껏다키게 되면 IP가 변경되기때문에 차후에 헷갈릴 소지가 있기 때문에 아래사진처럼 고정IP설정합니다.

 

방법은 제어판-네트워크-네트워크 인터페이스-LAN포트 들어가서 고정IP주소를 설정하시면 됩니다.

 

다음은 DDNS 설정입니다.

DDNS 란 ip가 바뀌어도 ddns로 설정한 도메인값으로 적용되어 ip를 외우지 않아도 됩니다.

 

제어판-외부 액세스-DDNS 에서 호스트이름에 원하는 주소이름을 적습니다. 설정한뒤 연결 테스트를 클릭하면 정상이 뜨면 확인을 눌러 설정합니다.

 

제어판-보안-인증서 생성을 클릭후 새 인증서 추가를 클릭합니다.

다음 Let's Encrypt에서 인증서 얻기를 체크하고 다음을 눌러주면 됩니다.

 

 

도메인 이름 :DDNS에서 설정한 주소를 작성합니다. 

이메일 : 옆에 화살표 누르면 저러한 메일이 있거나 없으면 작성하시면됩니다.

주제 대체 이름 : 사용하는 도메인을 작성하면 됩니다. 

설정후에 적용을 눌러 적용합니다.

두둥!!!!!!!! 이렇게 되면 인증서까지 설정이 완료 되게 됩니다.!!!

 

다음은 받은 인증서를 이용하여 HTTPS 설정입니다.

제어판-네트워크-DSM설정 에서 아래 체크박스를 클릭후 적용을 클릭합니다.

요기까지가 https 설정입니다.!

바로 이어서 역방향 프록시 설정까지 하겠습니다.

 

역방향 프록시란.... 시놀로지 DSM접속하기 위해서는 기존에는 https:ddns주소:5000 이런식으로 포트를 적어야 접속이 되었을것입니다. 하지만 위에처럼 따라오면 포트없이(https://ddns주소) 접근이 가능토록 하게됩니다.

 

제어판-응용 프로그램포털-역방향 프록시 규칙  을 누른뒤

설명 : nas(임의)

프로토콜 : 저희가 위에서 https적용을 하였기 때문에 https를 클릭합니다.

호스트 이름 : DDNS주소(asd.synology.me)

포트 : 443

프로토콜 : HTTPS

호스트 이름 : localhost

포트 : 5001(위에서 https 5001로 설정)

설정을 마친뒤 확인을 눌러주면 적용됩니다.

 

한가지 더 해줘야 하는데요 옆에 사진처럼 포트포워딩을 해줘야 합니다. 저는 ASUS의 공유기를 이용하고 있으며 포트포워딩은 외부의 ip:port를 입력하면 설정한 내부 ip로 이동하게 만들어주는 역할입니다. 

예시로 본인이 사는 어디아파트만 적으면 몇동 몇호 인지 모르듯이 뒤에 따라오는 몇동 몇호에 거주중인지 알려주는 역할을 하게 됩니다.! 

 

아래처럼 https://ddns주소 를 작성하면 아래처럼 접속이 가능한것을 볼수 있습니다. 

 

초기 네트워크 설정은 여기까지!!!

'IOT > Synology' 카테고리의 다른 글

[Synology] Transmission 설치기  (0) 2020.06.02

이번의 대망의 Hassio를 설치하려고 합니다. 

Hass.io 를 설치하려면 Docker 설치가 되어있어야 합니다. 

참고로 도커는 설치 가능한 모델이 한정되어 있습니다. 

적용 모델만 가능하니 아래 사진을 보고 확인하시기 바랍니다.

출처 : https://www.synology.com/ko-kr/dsm/packages/Docker

시놀로지 패키지센터-docker 검색하신뒤 설치를 눌러서 진행합니다.

아래 링크에 가서 Hass.io 설치파일을 받아줍니다.

https://www.dropbox.com/s/cnnyuwb6b0riyd9/hassio_x64-6.1_20191006-3c5c9bce.spk

 

받은 파일을 패키지센터-수동설치-찾아보기    파일을 찾아서 설치해주면 됩니다.!

아래와 같이 설정하고 설치를 진행합니다.

설치를 진행하고 Hass.io 포트인 port : 8123 포워딩을 진행합니다.

 

Docker 에 가면 아래와 같이 컨테이너가 실행되어야 합니다. 

http://nasip:8123 주소쳐서 가면 설치가 진행됩니다. 20분 가량 기다립니다.

설치가 완료되면 아래처럼 설정화면이 나오게 됩니다.

설정을 진행하고 난뒤 설치가 완료됩니다.!!!!!

+ Recent posts