'스프링4 코딩공작소' 라는 책으로 스프링에 대해 공부중에 있는데 src/main/resources 이하의 폴더인 META-INF에 대해 갑자기 궁금증이 생겨 찾아보았다. (평상시에는 아무 신경을 쓰지 않고 있었다...)


일단 현재 공부하고 있는 교재에서는 DB의 데이터 및 스키마 생성을 위한 SQL파일과 각종 프로퍼티 파일 그리고 빈 설정을 위한 XML 파일 등을 위치시키고 있다.


찾아본 결과 META-INF 폴더는 manifest 파일을 담는 폴더로 활용되며 manifest 파일이란 일종의 jar 파일의 사용매뉴얼이나 스펙을 가지고 있는 사용설명서와 비슷한 개념이라고 한다. 

예를들면, 실행되는 main 함수가 어떤 class에 위치하고 있는지, 프로그램의 보안정책이 어떻게 되는지, sealing 정보 등을 담고 있다고 한다.


즉, META-INF 폴더는 자바 패키징 기술인 jar의 일부분이라고 할 수 있다. 그럼 jar는 무엇일까? jar는 기본적으로 zip파일과 파일 포맷이 동일하지만 zip외에 부가적인 규약이 정해져 있고, 그 중 하나가 META-INF 디렉터리 이다.


교재에서 XML같은 설정 파일을 META-INF에 두는 이유는 해당 어플리케이션을 war가 아닌 jar로 패키징 해서 배포할 수 있기 때문이다.


정리하면,

- META-INF 폴더는 jar파일 생성시 일종의 사용설명서인 manifest 파일을 담기위한 디렉터리이다.

- 스프링 프로젝트에서는 해당 프로젝트를 jar로 패키징해서 배포할 수 있으므로 프로젝트와 관련된 설정파일을 META-INF 폴더 밑에 두고있다.


'개발 > 기타' 카테고리의 다른 글

LastModified 헤더를 이용한 파일변경 체크  (0) 2020.12.06
Maven 기본  (0) 2019.11.12
UTC, GMT, Epoch Time  (0) 2019.10.11
Ajax에 관하여  (0) 2018.12.13
TCP/IP  (0) 2017.08.01

TCP/IP(Transmission Control Protocol / Internet Protocol)

 

 - 컴퓨터와 컴퓨터간의 지역네트워크(LAN : Local Area Network) 혹은 광역네트워크(WAN : Wide Area Network)에서

   원활한 통신을 가능하도록 하기위해 만든 통신규약(Protocol)이다.

 

 - 왜 TCP/IP 를 사용하는가? 

   개방성 : 하드웨어, 운영체제, 접속매체에 관계없이 동작할 수 있다. > 인터넷 통신을 위한 핵심으로 선택되었다.


 - IP 프로토콜 위에 TCP 프로토콜이 놓이게 되므로 TCP/IP 라고 부르게 되었다.


 - IP : node와 node 즉 컴퓨터와 컴퓨터간의 데이터 패킷을 전송하기 위해서는 각 node의 위치(주소값)을 알아야 한다.

   이러한 주소값을 IP Address라고 하며, 점(.)으로 구분되는 4 byte 값을 사용한다. ex) 192.168.100.100

   IP주소를 인간이 식별하기 쉽게 사용하는 것을 Domain Name이라 한다. ex) www.google.com


 - TCP : 서버와 클라이언트 간에 데이터를 신뢰성있게 전달할 수 있도록 하기위해 만들어진 프로토콜이다. 

   데이터는 네트워크 선로를 통해 전달되면서 손실되거나 순서가 뒤바뀔수 있는데, TCP는 이러한 손실을 찾아내어 교정하고

   순서를 재조합할 수 있도록 해준다. 연결지향 프로토콜이다.

   다음의 두가지 기능을 가진다.

     1. 패킷이 빠졌을 경우 재전송 요청

     2. 패킷에 일련번호를 줌으로써, 서로 다르게 도착할 경우 순서를 재조합(교정)한다.

        > 패킷은 하나의 고정된 경로로 전달되는 것이 아니라 임의의 경로를 사용하기 때문에 순서가 다르게 도착할 수 있다.

   



TCP와 UDP(User Datagram Protocol)


 - 데이터를 전송하기 위한 프로토콜에는 TCP외에 UDP라는 프로토콜이 존재한다.

 

 - TCP : 연결지향이며, 자체적으로 오류를 처리 및 뒤바뀐 메시지를 교정시켜주는 기능을 가지고 있다.

   연결지향이란 데이터를 전송하는 측과 데이터를 전송받는 측에서 전용의 선로(Session)을 만든다는 의미이다.

   데이터의 신뢰도가 중요하다고 판단될 때 주로 사용한다.

 

 - UDP : 비연결지향이며, 오류를 처리하거나 순서를 재조합하는 기능을 가지고 있지 않다. 단순히 데이터를 받거나, 

   던져주기만 하는 프로토콜로, 특히 실시간 멀티미디어 정보를 처리하기 위해 주로 사용한다.




OSI 7계층과 TCP/IP 4계층


 - OSI(Open System Interconnection Reference Model)는 ISO에서 제안한 모델로 컴퓨터 네트워크 소프트웨어의

   개발을 돕기위해 7계층으로 나누어 정의한 명세서이다.

 

 - 컴퓨터와 컴퓨터사이의 데이터 전송을 위해서는 위의 7개의 계층을 '직-간접적'으로 거쳐서 전송이 된다.

 

 - 7계층으로 나뉜 이유는 각 계층은 캡슐화와 은닉화가 가능하며 보통의 개발자는 응용계층과 표현계층만 고려하여 

   개발을 하게된다.


 - OSI 7계층을 4단계로 단순화 시켜 TCP/IP 4계층이라 한다.





TCP/IP 4계층에 의한 데이터 전송

 

 - WWW(World Wide Web) 서비스를 이용하여 데이터가 전송되는 과정을 알아본다.

 

   1. 사용자는 브라우저를 통해 www.google.com 같은 URL 입력을 통해 웹페이지를 요청한다.

   

   2. 사용자의 요청(문자 메시지)는 인터넷을 통해 전달하기 용이한 패킷으로 만들기 위해 TCP 패킷으로 만들어진다.

  

   3. 이것을 원하는 목적지(주소)로 보내기 위해 IP패킷으로 다시 만들어지고, 이것은 Eternet카드로 보내져 인터넷으로 나가게된다.

  

   4. 인터넷의 여러장치(라우터, 토큰링 등)를 통해 www.google.com의 이터넷 카드로 TCP/IP 패킷이 전달되면 이 IP패킷을

      분석해서 이 패킷이 어디에서 왔고, 그 도착지가 어디인지를 판단하게 된다.


   5. 판단결과 목적지가 본인이라면 이 패킷을 전송 계층으로 보내게 되고, TCP 프로토콜을 사용하여 메시지가 누락된게

      있으면 재요청하고 순서를 재호합 하는 등 패킷을 검사하여 이것을 다시 응용계층으로 보낸다.


   6. 응용 계층에서는 웹서버(IIS, Apache 등)가 통신 패킷을 HTTP 프로토콜에 준하여 검사를 하게된다.

      이후 사용자가 요청한 웹페이지를 읽어들여 위의 반대 과정을 통해 사용자에게 전달하게 된다.

      

   7. 사용자에게 전달된 데이터를 웹브라우저가 받아 HTTP 프로토콜에 준하여 렌더링 작업을 거친 후 화면에 뿌려주게 된다.


  - 위 과정에서처럼 각각의 계층은 각각의 계층끼리만 상관하고 있다. 즉, 웹서버는 HTTP프로토콜에 준하여 브라우져와

    통신을 하고있고, 전송계층은 TCP프로토콜에 준하여 통신계층끼리 통신함을 알 수 있다.





TCP의 연결 지향


 - 위와 같은 데이터 통신이 일어나기 전에 브라우저와 서버간에는 연결을 성립하는 과정이 선행된다. 


 - 즉 데이터가 전송되기 전에 데이터를 교환하기 위한 통신선로를 개설하게 되고, 이 통신선로 1개를 만들기 위해서는 

   3번의 데이터 전송이 일어나므로 이것을 three way handshake 라고 한다.

   ex) 1. "거기 서버 있나요?" 2. "예 있습니다. 데이터 보내주세요." 3. "네 지금 보낼께요."

 





출처


 - https://www.joinc.co.kr/w/Site/Network_Programing/Documents/IntroTCPIP

'개발 > 기타' 카테고리의 다른 글

LastModified 헤더를 이용한 파일변경 체크  (0) 2020.12.06
Maven 기본  (0) 2019.11.12
UTC, GMT, Epoch Time  (0) 2019.10.11
Ajax에 관하여  (0) 2018.12.13
META-INF 디렉터리에 대하여  (1) 2018.04.12

JAVA에서 리스트를 정렬하고자 할 때는 java.util.Collections의 static method인 sort를 활용할 수 있다.


일반적으로 문자나 숫자를 오름차순 또는 내림차순으로 정렬할시에는 

Collections.sort(ArrayList<T> list) 와 Collections.reverse(ArrayList<T> list) 를 활용하여 쉽게 정렬된 결과를 얻을수 있다.


이는 아래 String 클래스처럼 T클래스가 Comparable<T> 을 상속받아 구현해 놓았기 때문이다.

(정확히는 Comparable 인터페이스의 compareTo 메서드를 오버라이딩)











하지만, 일반적인 케이스에서 벗어나서 특정한 규칙에 따라 정렬하고자 하면 다음 두가지 방법으로 할 수 있다.


1. 정렬하고자 하는 객체의 클래스에 Comparable 인터페이스를 implements 하고 compareTo 메서드를 오버라이드하여 Collections.sort(ArratList<T> list) 로 정렬한다.


Human 클래스의 객체List를 정렬하고자 하는 경우, Human 클래스를 다음과 같이 정의하고 Collections.sort(List<Human> list) 를 사용한다.

Human 클래스 선언 예)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Human implements Comparable<Human>{
    public int age;
    public String name;
 
    // ... 기타 선언 생략
 
    public int compareTo(Human human){
 
        // 정렬규칙에 따라 this와 human의 변수를 비교 후 
        // -1,0,1 반환
        // this가 큰 조건에서 1
 
    }
 
}
cs



2. Collections.sort(ArrayList<T> list, Comparator<T> c) 를 활용하여 정렬한다.


Human 클래스는 건들지 않고 Comparator 인터페이스를 구현한 클래스를 만들어 그 객체를 sort 메서드에 함께 전달한다.

Collections.sort(List<human> list, new HumanComparator()) 으로 사용한다.


이 때, Comparator에는 compare()와 equals() 메서드가 있으며 equlas()메서드는 Object클래스에서 정의가 되어있으므로, 

compare()만 오버라이드해서 사용하면 된다.


Collections.sort 메서드에 같이 인자로 전달되는 Comparator 선언 예)

1
2
3
4
5
6
7
8
9
10
class HumanComparator implements Comparator<Human>{
 
    @Override
    public int compare(Human o1, Human o2) {
 
        // 정렬 규칙에 따라 -1,0,1 반환
        // 첫번째 인자(o1)이 크면 1 반환
    }
        
}
cs




정리한다면, 클래스를 정렬가능(Comparable)하게 하던가 정렬시킬수 있는 도구(Comparator)를 같이 던져주던가

두가지 방법으로 정렬시킬수 있다.


끝.


 

'개발 > JAVA' 카테고리의 다른 글

Comparator, Comparable 어떻게 사용할까?  (0) 2020.11.29
LocalDateTime, ZonedDateTime  (0) 2019.10.11
BigDecimal & BigInteger  (0) 2017.04.18
Array 와 ArrayList 사이의 변환  (0) 2017.03.28
9. 생성자와 가비지 컬렉션  (0) 2017.02.22


BigDecimal, BigInteger 클래스는 java.math 패키지에 포함되어 있다.


1. 사용하고자 하는경우 

 - 사용하고자 하는 값이 int, float 등으로 표현하는 범위를 넘을 경우

 - float 이나 double 실수 연산시 정확한 결과값이 나오지 않는 경우


2. 생성자 및 사칙연산 함수

 - 반환형이 String 처럼 객체인 것에 유의한다.(자신의 값이 변하지 않음)

1
2
3
4
5
6
7
BigDecimal input = new BigDecimal("25");
BigDecimal value = new BigDecimal(String.valueOf(25));
 
BigDecimal rslt1 = value.add(new BigDecimal("10"));            // 덧셈
BigDecimal rslt2 = value.multiply(new BigDecimal("10"));     // 곱하기
BigDecimal rslt3 = value.subtract(new BigDecimal("10"));       // 빼기
BigDecimal rslt4 = value.remainder(new BigDecimal("10"));      // 나누기
cs


Array 와 ArrayList 사이의 변환


1. Array -> ArrayList 변환시 유의할 점

 - Arrays.asList() 를 사용한다.

 - 하지만 Arrays.asList() 의 리턴형은 fixed-size의 List이므로 add()를 사용할 수 없다.(get(), set(), contains()는 사용가능) 

 - 리턴되는 객체가 java.util.ArrayList가 아니라 java.util.Arrays.ArrayList 이기 때문이다.

 - 그러므로 다음 예시처럼 사용해야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test01 {
    public static void main(String[] args) {
        
        String strArr[] = {"가","나","다"};
        ArrayList<String> strArrayList = new ArrayList<String>();

        // 1. Array -> ArrayList
        strArrayList = new ArrayList<String>(Arrays.asList(strArr));
        System.out.println(strArrayList);
        
        // 2. ArrayList -> Array
        String strArr2[] = strArrayList.toArray(new String[strArrayList.size()]);
        for(int i=0;i<strArr2.length;i++){
            System.out.print(strArr2[i] + " ");
        }
        
    }
}
cs


'개발 > JAVA' 카테고리의 다른 글

LocalDateTime, ZonedDateTime  (0) 2019.10.11
Collections를 이용한 정렬(sort method) 활용  (0) 2017.05.09
BigDecimal & BigInteger  (0) 2017.04.18
9. 생성자와 가비지 컬렉션  (0) 2017.02.22
8. 인터페이스와 추상 클래스  (0) 2017.02.21

인스턴스(instance) 변수와 지역(local) 변수

 - 인스턴스 변수 : 클래스 내에 선언한 변수 > 변수가 들어있는 객체안에(Heap)에 저장된다.

 - 지역 변수 : 메서드 내에 선언한 변수, 매서드의 매개변수도 지역변수에 해당한다. > 변수가 들어있는 매서드안에(Stack)에 저장된다.


스택(stack)과 힙(heap)

 - 스택 : 매서드의 호출과 지역변수가 사는 곳

 - 힙 : 모든 객체가 사는 곳(객체가 가지고 있는 인스턴스 변수도 포함한다.) > 가비지 컬렉션의 대상이 된다.


생성자

 - Student yang = new Student();

    1. Student yang : 레퍼런스 변수를 선언한다.

    2. new Student() : Student 클래스의 생성자를 실행한다. (객체의 초기화, heap 영역에 생성)

    3. = : 래퍼런스 변수와 생성된 객체를 연결한다.

- 반드시 new 라는 키워드로 생성자를 실행한다.

- 생성자는 반환형이 없으며 파라미터가 없는 기본생성자는 컴파일러가 자동으로 생성한다.

  ex) public Student(){  }  >> 접근제한자는 public,private,default 모두 가능하다.

- 생성자 오버로딩이 가능하며 이때 기본생성자는 개발자가 임의로 추가해야 한다.


상속관계에서의 생성자

 - new 키워드로 어떤 객체가 만들어지면 그 객체의 상위클래스들의 모든 생성자가 실행된다.

   최초의 클래스인 Object 클래스까지 거슬러 올라가며 이를 생성자 연쇄(constructor chaining)라 한다. (상위 클래스의 생성자부터 실행)


super(), this()

 - 임의로 상위클래스의 생성자를 호출할 경우 사용하며 컴파일러가 기본으로 생성하여 준다.

 - 생성자의 첫번째 선언문에 꼭 위치하여야 한다.

 - this() 로는 본인 클래스의 오버라이드된 다른 생성자를 호출할수 있으며 첫번째 선언문에 사용되어야 한다. 즉, super() 와 this() 중 하나만 사용가능하다.


객체 life cycle

 - 객체는 그 객체의 레퍼런스변수가 살아있는 동안만 살아있으며 객체에 접근할 방법이 사라지면(레퍼런스 변수가 사라지면), GC에 의해 제거된다.

 - 객체가 GC에 의해 제거되는 3가지 경우

   1. void 메서드가 종료될 때 제거된다.

      void go(){

          Life z = new Life();

      } 

   2. 레퍼런스 변수에 다른 객체를 대입하면 제거된다.

       Life z = new Life();

       z = new Life();  // 윗 줄에서 생성된 객체는 제거된다.

   3. 레퍼런스 변수에 null을 대입하면 제거된다.

       Life z = new Life();

       z = null; // 윗 줄에서 생성된 객체는 제거된다.

 


 

'개발 > JAVA' 카테고리의 다른 글

LocalDateTime, ZonedDateTime  (0) 2019.10.11
Collections를 이용한 정렬(sort method) 활용  (0) 2017.05.09
BigDecimal & BigInteger  (0) 2017.04.18
Array 와 ArrayList 사이의 변환  (0) 2017.03.28
8. 인터페이스와 추상 클래스  (0) 2017.02.21

1.abstract 추상클래스

 - abstract public class Animal{ }

 - new 키워드를 통해서 instance를 생성할수 없다.(compile error)

 - 추상class를 제외한 클래스를 '구상' class라 한다.

 - 반드시 확장(extends) 해야하는 class


2.abstract method 추상 메소드

 - 몸통(중괄호)가 없는 형태이다. ex) public abstract void eat();

 - 세미콜론(;)으로 선언을 끝내는 형태이다.

 - abstract class 이내에서만 선언되어야 한다. (추상 클래스안에 일반메서드와 추상메서드의 혼용은 가능하다.)

 - 왜 사용할까? 

    1. 실제 메서드에 코드를 집어넣지 않았더라도 하위클래스를 위한 일종의 규약(protocol)의 일부를 정의한다.

    2. 다형성의 장점이 있다.(오버라이드)

 

3.구상class를 처음 만들때는 상위에서 선언된 추상메서드를 모두 구현해야 한다.

 - 확장관계 중간에 이미 구현된 추상메서드는 구현할 필요가 없다.


'개발 > JAVA' 카테고리의 다른 글

LocalDateTime, ZonedDateTime  (0) 2019.10.11
Collections를 이용한 정렬(sort method) 활용  (0) 2017.05.09
BigDecimal & BigInteger  (0) 2017.04.18
Array 와 ArrayList 사이의 변환  (0) 2017.03.28
9. 생성자와 가비지 컬렉션  (0) 2017.02.22

+ Recent posts