tuter77

2022.12.26 TIL 본문

TIL

2022.12.26 TIL

tuter77 2022. 12. 26. 18:42

<Spring>

 

 AWS 설정.

 

EC2 새 인스턴스를 region 서울로 지정하여, 실행.

키페어 만들고, window 원격 컴퓨터로 실행했다.

해당 원격컴퓨터에는 키페어 암호로 생성한 Administor(원격컴퓨터 사용자) 로그인을 해야하는데, 

인스턴스 항목 중 연결 > RDP 클라이언트 연결에서 키페어를 사용하여 암호를 생성하고 연결 할 수 있다.

 

이 후 접속된 원격 컴퓨터에서 강의에 필요한 Java 11버전과 Tomcat을 다운로드하여 C드라이브에 넣어주고, 환경변수 path에 등록 및 JAVA_HOME 경로를 만들어 톰캣이 Java를 찾을 수 있게 지정해주었다.

(경로가 제대로 등록되었는지 확인은 cmd에서 java -version, javac -version 명령어를 통해 가능하다.)

 

tomcat은 cmd에서 startup 명령어 혹은 tomcat /bin 내부에 startup 배치파일을 이용해 실행 가능하고, 잘 연결되었는지는 web상에 localhost:8080 으로 확인할 수 있다.

 

이 원격 컴퓨터의 톰캣 서버에 접근하려면 방화벽 설정이 필요한데 방화벽은 2가지를 설정해 주어야한다. 

 

원격 컴퓨터 자체의 방화벽.

원격 컴퓨터 내에서 firewall을 검색해 설정에 들어간다. 이후 고급설정 이라는 항목에서 rule > inbound 로 들어가 new rule을 만들어준다.

내용은 Tcp의 8080 서버에 접근할 수 있게해주는 것.

port > 특정 로컬 포트 > 8080입력 순으로 설정해줄 수 있다.

 

▷ EC2의 방화벽 설정. 

EC2 메뉴에서 인스턴스 > 보안그룹으로 들어간다.보안 그룹내에 이번에 생성한 보안그룹을 클릭(내 경우엔 앞의 스파르타 학원에 강의 때 만들어 두었던 서버들 때문에, 제일 마지막으로 생성된 보안그룹으로 확인하였다. 이름을 Fast와 같이 달아주어 후에 사용할 때 헷갈리지 않게 지정했다.)> 새 규칙을 생성하여 모든 TCP에서 접근이 가능하게 해주었다.

 

위 방화벽 설정이 끝난 후 내 PC 웹에서 localhost:8080으로 원격 컴퓨터의 톰캣페이지에 접근할 수 있었다.

 

이전에 강의들을 땐 이 원격 컴퓨터 서버설정에서 헤맸었는데, 이번엔 linux가 아닌 윈도우여서 그런지 한결 수월했다. 

 

● 원격 컴퓨터 프로그램 실행.

 

 WAS(Tomcat 사용)와 브라우저를 통해 원격프로그램을 실행할 수 있다.

 

▷ 브라우저

- 원격 컴퓨터의 로컬 ip주소를 입력해 원격컴퓨터를 호출한다. 

 

▷ 원격 컴퓨터 

- 톰캣 포트(8080)가 위 요청을 받아 프로그램을 실행하게 된다.

 

이와같이 프로그램을 실행하기 위해선 프로그램 등록과 url과 프로그램을 연결하는 두가지 선결요건이 필요하다.

프로그램 등록은 @Controller 애노테이션을 프로그램 앞에 붙여주면 된다.

예시는 아래와 같다.

@Controller

public class Hello {

 

      @RequestMapping("/hello") // url과 main()을 연결

      public void main(){

             System.out.println("Hello");

       }

}

 

 

 

<Java>

 

*static이면 객체 생성이 필요없이 메인이 호출가능하다.

 

객체 간의 협력

- 객체 지향 프로그램에서 객체 간에는 협력이 이루어짐.(메세지가 오간다.)

- 협력을 위해서는 필요한 메시지를 전송하고 이를 처리하는 기능이 구현되어야 한다.

- 매개 변수로 객체가 전달되는 경우가 발생한다.

 

구현된 협력 기능 함수들은 ctrl 을 누른상태로 클릭하면 해당 클래스의 메소드로 갈 수 있다.

 

여러 인스턴스에서 공통으로 사용하는 변수 선언 - static 변수

 

▷ 공통으로 사용하는 변수가 필요한 경우

- 여러 인스턴스가 공유하는 기준 값이 필요한 경우

- 학생마다 새로운 학번 생성

- 카드회사에서 카드를 새로 발급할 때마다 새로운 카드 번호를 부여

- 회사에 사원이 입사할 때마다 새로운 사번이 필요한 경우.

 

데이터 영역 메모리

static 변수 < 공유 < 인스턴스 A, 인스턴스 B, 인스턴스 C

 

▷ static 변수 선언과 사용하기

 

예시 : static int seialNum;

- 인스턴스가 생성될 때 만들어지는 변수가 아닌, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당한다.(이 때에 만들어진다.)

- 클래스 변수, 정적 변수라고도 한다.(vs 인스턴스 변수)

- 인스턴스 생성과 상관 없이 사용 가능하므로 클래스 이름으로 직접 참조한다.(예시 : Student_serialNum = 100;)

static 변수는 앞선 Heap메모리가 아닌, code(명령어 집합) 메모리와 Data(또는 상수) 영어 메모리 중 Data영역 메모리에 생성된다. 프로그램이 다 끝나고 메모리가 업로드 되는 순간 삭제된다.

 

예시)

public class Employee {

public static int serialNum = 1000; //static 변수 선언.

 

private int employeeId;

private String employeeName;

private String department;

 

public int getEmployeeId() { //우클릭 source에서 getter/setter 자동생성.

return employeeId;

}

public void setEmployeeId(int employeeId) {

this.employeeId = employeeId;

}

public String getEmployeeName() {

return employeeName;

}

public void setEmployeeName(String employeeName) {

this.employeeName = employeeName;

}

public String getDepartment() {

return department;

}

public void setDepartment(String department) {

this.department = department;

}

}

위 예시에서 인스턴스들이 공동으로 사용할 static 변수를 생성했다.

 

public class EmployeeTest {

public static void main(String[] args) {

Employee employeeLee = new Employee();

employeeLee.setEmployeeName("이순신");

System.out.println(employeeLee.serialNum);

 

Employee employeeKim = new Employee();

employeeKim.setEmployeeName("김유신");

employeeKim.serialNum++;

 

System.out.println(employeeLee.serialNum);

System.out.println(employeeKim.serialNum);

//2개의 인스턴스가 1개의 메모리를 공유한다. > lee와 kim이 하나의 serialNum을 공유.

}

}

 

인스턴스 2개 (lee와 kim을 생성하여 static 변수인 serialNum을 공유하는지 출력해보았더니, 

위와 같이 같은 변수를 공유하고 있음을 알 수 있었다.

쉽게 정리해보면 

 

데이터 영역      |     스택메모리      |     힙 메모리  

                 

serialNum         >    employeeLee  >    employeeLee  인스턴스

                         >    employeeKim  >    employeeKim  인스턴스

 

이 형태를 띄고 있음을 알 수 있다.

위의 예시 과정에서 System.out.println(employeeLee.serialNum); 이 구문은 밑줄이 그어지는데, 이는 static변수는 클래스 이름을 참조하라는 뜻이다.

static 메서드는 인스턴스 생성과 무관하게 클래스 이름으로 호출될 수 있다.

인스턴스 생성 전에 호출 될 수 있으므로 static 메서드 내부에서는 인스턴스 변수를 사용할 수 없다.(인스턴스 변수는 메모리의 순서상 static이전에 생성되지 않았기 때문)

반면 일반 메서드에선 static 메서드를 사용하는건 문제가 없다.(메모리의 순서 때문)

 

▷ 변수의 유효 범위와 메모리

- 변수의 유효 범위(scope)와 생성과 소멸(life cycle)은 각 변수의 종류마다 다르다.

- 지역 변수, 멤버 변수, 클래스 변수는 유효범위와 life cycle, 사용하는 메모리도 다르다. 

 

- static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은 좋지 않다.

- 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버변수로 선언하는 것이 좋고, 멤버 변수가 너무 많으면 인스턴스 생성시 쓸데없는 메모리가 할당된다.  

 

오늘은 static 변수를 중심으로 메모리가 어떻게 할당되는지, 사용은 어떤식으로 해야하는지를 공부했다. 

블로그에 다 담지못하는 실습 예시들이 있지만, 글이 너무 길어지고 난잡해지는것같아 빼게되었다. 

오늘 공부한것 처럼 클래스내에서 사용되는 지역변수, 멤버변수, static 변수의 각 차이점을 잘 이해했고, 각 객체간에 변수와 메소드를 활용해 협력하는 것도 잘 이해한것 같아 뿌듯하다.

 

 

'TIL' 카테고리의 다른 글

2022.12.28 TIL  (0) 2022.12.28
2022.12.27 TIL  (0) 2022.12.27
2022.12.23 TIL  (0) 2022.12.23
2022.12.22 TIL  (0) 2022.12.22
2022.12.21 TIL  (0) 2022.12.21