2022-01-27(목) 11주차 4일

Jeongyun Heo·2022년 1월 27일
0

인터페이스와 개발자

03-OOP2 / 37 페이지

<<client>>Caller --- call ---> 인터페이스 ◁------- <<component>>Callee

Caller : 인터페이스 규칙에 맞게 호출. 객체를 쓰는 입장. Client.
다른 객체를 사용하는 객체. 사용하는 쪽을 Client라고 한다.

Callee : 그 인터페이스에 따라서 실제 작업을 하도록 구현한 클래스
호출 당하는 입장. 하나의 객체 component라고도 한다.

인터페이스 : 객체 사용 규칙

인터페이스 규칙을 작성하는 개발자가 있을 거고
Caller를 작성하는 개발자가 있을 거고
Callee를 작성하는 개발자가 있을 거

데이터를 꺼내주는 객체를 리턴 받는다.
어떤 거는 내가 직접 꺼내는데
복잡한 경우 대신 꺼내주는 사람도 있음

인터페이스를 만나면
인터페이스에 따라서 호출하는 클래스(Caller)를 만들어야 하는지
인터페이스에 따라서 호출되는 클래스(Callee)를 만들어야 하는지
둘 중의 하나의 입장일 것이다
Caller를 만들 때도 있고 Callee를 만들 때도 있다

Caller 개발 입장

03-OOP2 / 38 페이지

ArrayList에서 직접 꺼낼 수도 있다

◾ 직접 값 꺼내기
① get(2)
ArrayList ← Client
2번 인덱스에 있는 거 꺼내줘

② "유관순" 리턴

◾ 간접적으로 값 꺼내기
① iterator()
처음부터 끝까지 꺼내는 일을 하는 객체를 다오

② Iterator 구현체 리턴

③ hasNext() 호출
Iterator 인터페이스에 정의된 규칙에 따라 메서드 호출

④ get(i) i번째 꺼내줘
ArrayList ← Iterator 구현체

⑤ 값 리턴
ArrayList → Iterator 구현체

⑥ 리턴
Iterator 구현체 → Client

사용하는 쪽을 무조건 클라이언트라고 한다

🔹 Iterator (반복자)
목록(컬렉션)에서 데이터를 꺼내주는 일을 하는 객체

Client : 개발자가 만드는 caller

Client → Iterator ◁---- 구현체

Client
규칙에 따라서 구현된 객체에 대해서
hasNext() 호출
구현체
규칙에 따라 만든 구현체

list.iterator()를 호출하면
Iterator 규칙에 따라 만든 객체를 리턴 한다.
Iterator 규칙에 따라 만든 객체를 리턴 받아서
Iterator 규칙에 따라서 사용할 뿐이다.

Callee를 만드는 입장

<<interface>> FilenameFilter

File 객체에 list() 라는 메서드가 있음
list() 메서드는 내부적으로 이런 작업을 한다
FilenameFilter 객체를 사용해서
파일 목록에서 하나 가져와서 물어본다
accept() 이거 포함시켜 말어?
true 하면 리턴 목록에 포함시키고 false 하면 포함시키지 않는다
list() 파라미터에는 FilenameFilter 규칙에 따라서 만든 객체를 줘야 됨

FilenameFilter 규칙에 따라서 쓸 객체를 우리가 만들어야 됨

MyFilter 라는 concrete 구현체를 만든다.
class MyFilter implements FilenameFilter

규칙에 따라서 동작할 객체를 만드는 일이 callee

인터페이스 규칙에 따라서 메서드를 사용하는 caller를 만들 건지
인터페이스 규칙에 따라서 동작하는 클래스를 만들 건지
보통은 둘 중의 하나

앞으로 인터페이스를 만나면
인터페이스를 구현한 클래스를 만들어야 하는 건지 (Callee)
인터페이스 규칙에 따라서 호출되는, 작업을 할, 클래스를 만들어야 하는 건지 (Callee)
인터페이스 규칙에 따라서 만들어진 객체를 리턴받아서, 그 객체를 얻어서, 그 객체를 사용하는 클래스를 만들어야 하는 건지 (Caller)
판단을 내려야 한다

둘 다 만들어야 될 때도 있고
인터페이스까지 만들어야 될 때도 있음
우리가 MyList에서 그렇게 함

MyList에서는 우리가 직접 DAO를 정의함

그리고 DAO 규칙에 따라서 호출될, 동작할, AbstractBoardDao도 직접 만들었다. 동작할 Callee를 만든 거.

인터페이스 : BoardDao

Callee : AbstractBoardDao

Caller : BoardController

BoardDao boardDao;  // 인터페이스 레퍼런스

BoardDao 인터페이스 규칙에 따라서 만든 객체를 사용하는
boardDao.findAll() ← 이렇게 사용

인터페이스에 있는 추상 메서드를 호출하는 게 아님
boardDao가 실제로 가리키는 객체의 클래스의 findAll()을 호출
BoardDao 인터페이스에 있는 findAll()은 추상 메서드라 아무것도 구현되어 있지 않다.

인터페이스와 추상클래스는 인스턴스를 못 만듦
오로지 인터페이스를 구현한 클래스만 인스턴스를 만들 수 있다

주소가 없으면 NullpointerException 에러 뜸
가리키는 객체가 없으면 어떤 클래스의 findAll()을 호출해야 될 지 모름
주소가 없는 상태에서 메서드를 호출할 수 없다.
객체를 모르니까 어떤 클래스의 객체인지 클래스를 모름.

인터페이스 레퍼런스
인터페이스를 구현한 클래스의 인스턴스가 생성되면 그 인스턴스 주소를 담겠다는 뜻
객체를 생성했다는 뜻은 그 클래스에 추상 메서드가 한 개도 존재하지 않는다는 거 (concrete class)
인터페이스 BoardDao의 규칙에 따라서 만든 클래스라는 거
BoardDao의 모든 메서드가 구현되어 있는 상태
이미 boardDao에는 유효한 인스턴스 주소가 들어 있을 거
그 인스턴스는 BoardDao 인터페이스 규칙에 따라서 모든 메서드를
모든 추상 메서드를 완벽하게 구현한 클래스
구현된 메서드 중에서 findAll()을 호출하라는 뜻

객체 사용 규칙을 안 정하니까 중구난방으로 Dao마다
메서드 이름을 다르게 지어서
인터페이스 BoardDao가 없었을 때 관리가 안 됐었음

인터페이스 : BoardDao / FilenameFilter / Iterator

Callee : AbstractBoardDao / MyFilter

Caller : BoardController / Exam0110

BoardController --call--> BoardDao ◁-----AbstractBoardDao

AbstractBoardDao : 규칙에 따라서 클래스 만듦
BoardController : 규칙에 따라서 메서드 호출

2교시 시작

Standalone Application

91-미니프로젝트 / 9 페이지

인터넷이 연결 안 돼도 되는 거
HWP, MS-Word, Excel, PowerPoint, 메모장, 그림판, eclipse, vscode, Photoshop 등

내가 쓰는 컴퓨터가 로컬
로컬푸드..
로컬 컴퓨터의 자원을 사용해서 App. 실행

Standalone 방식의 S/W 유지보수 한계

Local Business
경쟁이 별로 치열하지 않음

Global Business
더 큰 시장에 판매할 수 있음.
다른 나라 기업 입장에서도 똑같음. 서로 경쟁이 치열

Local Business → Global Business → 경쟁이 치열. 가속화
→ 제품의 생명주기가 짧아짐 → 조직 변경이 잦아짐 → 업무 프로세스 변경이 잦아짐
→ App. 업그레이드 간격이 짧아짐 → 유지보수가 힘들어진다

해결책
App.이 변경되더라도 재설치를 안 하는 방법이 없을까?
⟹ 예전의 Unix 머신에서 사용하는 방법을 도입
모든 프로그램을 서버에서 돌리는 거
App.을 서버에서 실행!
기능을 업그레이드 하더라도 서버만 업그레이드 하면 됨

Client / Server Application

Standalone       Server App.       Remote => Server

App.             Client App.       Local => Client

Server App. : 실제 업무를 처리
Client App. : 사용자에게 UI를 제공. 사용자의 입력을 서버 App.에 전달

① 사용
② 요청
③ 요청 작업 처리
④ 작업결과 리턴

이 구조의 이점
기능 변경은 서버쪽만 하면 된다

Web Application 구조

① 요청
Client → HTTP 통신 → Web Server
② 요청 전달
Web Server → Application Server
③ 실행
Application Server → App.
④ 실행결과 리턴
Web Server ← Application Server
⑤ 응답
Client ← HTTP 통신 ← Web Server

Web Server
Apache
NGINX
IIS

Application Server
Tomcat
Resin
Jetty
JBoss
WebLogic
JEUS
Undertow ⭐

톰캣은 그냥 서블릿
아파치는 웹 서버
웹 서버랑 Application Server 구분하기

개발자가 만드는 건 App.
Application Server에서 구동되는 App.을 만든다

Spring Boot = Web Server + Application Server

Undertow는 JSP 실행할 수 없음
스프링 부트는 잘 안 쓰려고 하고있음

Calculator App.을 C/S 구조로 전환하기

전환하는 이유 : 기능 변경을 자유롭게 하기 위해서

java.net.Socket

Socket 클래스

모든 프로그램은 포트번호가 있다.

서버 안에서 돌아가는 애플리케이션들을 구분 하는 게 PORT

java.net.ServerSocket

IP 번호 없이 PORT

in.nextLine()

public key : 암호화할 때 쓰는 키. 자물통.
private key : 열쇠.

pem ← 식별코드

[ec2-user@ip-172-31-1-174 ~]$ sudo yum update

y

[ec2-user@ip-172-31-1-174 ~]$ sudo yum install git

설치확인

[ec2-user@ip-172-31-1-174 ~]$ git --version
git version 2.32.0

https://aws.amazon.com/ko/ec2/pricing/on-demand/

https://docs.aws.amazon.com/ko_kr/corretto/latest/corretto-11-ug/amazon-linux-install.html

[ec2-user@ip-172-31-1-174 ~]$ sudo yum install java-11-amazon-corretto-headless

잘 설치되었는지 확인하기

[ec2-user@ip-172-31-1-174 ~]$ java -version

[ec2-user@ip-172-31-1-174 ~]$ javac -version

[ec2-user@ip-172-31-1-174 ~]$ readlink -f /usr/bin/java

[ec2-user@ip-172-31-34-137 ~]$ readlink -f /usr/bin/java
/usr/lib/jvm/java-11-amazon-corretto.x86_64/bin/java

[ec2-user@ip-172-31-1-174 ~]$ nano .bash_profile

export JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto.x86_64

Ctrl + O
엔터
Ctrl + X

[ec2-user@ip-172-31-34-137 ~]$ cat .bash_profile

[ec2-user@ip-172-31-34-137 ~]$ source .bash_profile

[ec2-user@ip-172-31-1-174 ~]$ echo $JAVA_HOME
/usr/lib/jvm/java-11-amazon-corretto.x86_64

[ec2-user@ip-172-31-1-174 ~]$ mkdir git

[ec2-user@ip-172-31-1-174 ~]$ cd git

[ec2-user@ip-172-31-1-174 git]$ git clone 주소 bitcamp-study

[ec2-user@ip-172-31-34-137 project-app1]$ ./gradlew build
-bash: ./gradlew: Permission denied

실행권한을 부여할 때 2진수 사용

[ec2-user@ip-172-31-34-137 project-app1]$ chmod 764 ./gradlew

[ec2-user@ip-172-31-34-137 project-app1]$ ./gradlew build

[ec2-user@ip-172-31-34-137 app-server]$ sudo yum install tree

[ec2-user@ip-172-31-34-137 app-server]$ java -Dfile.encoding=UTF-8 -cp ./build/classes/java/main com.eomcs.app1.ServerApp
[계산기 서버]
클라이언트의 연결을 기다림!

소스파일에 에러가 있는 상태에서 에러남
project-app1 소스코드에 에러가 없어야 됨

보안 그룹 가서 8888 포트 추가하기

인바운드 규칙 편집

규칙 추가

C:\Users\JYH\git\bitcamp-study\project-app1\app-client> java -Dfile.encoding=UTF-8 -cp bin/main com.eomcs.app1.ClientApp

ps -el | grep java

0개의 댓글