40. SQL 의 4가지 DML
SELECT, INSERT, DELETE, UPDATE
41. KEY 의 정의
데이터베이스에서 조건에 만족하는 튜플을 찾거나 순서대로 정렬할 때 기준이 되는 속성
무언가를 식별하는 고유식별자(identifier)
42. 기본키, 후보키, 대체키
기본키 : 후보키 중에서 선택한 주요 키(Main key)
한 릴레이션에서 특정 튜플을 유일하게 구별할 수 있는 속성
Null 값 불가능(개체 무결성의 첫 번째 조건)
동일 값을 중복하여 저장할 수 없음(개체 무결성 두 번째 조건)
후보키 : 릴레이션을 구성하는 속성 중에서 튜플을 유일하게 식별할 수 있는 속성들의 부분집합
모든 릴레이션은 하나 이상의 후보키를 갖는다
릴레이션의 모든 튜플은 유일성과 최소성을 가져야한다.
기본키가 될 수 있는 키들을 후보키라고 한다.
대체키 : 후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키
보조키
튜플 : 릴레이션을 구성하는 각각 행과 속성의 모임
튜플의 수 = Cardinality = 기대수 = 대응수
43. 외래키
어느 릴레이션 속성의 집합이 다른 릴레이션에서 기본키가 되는 것을 말한다.
44. 개체무결성과 참조무결성
개체무결성은 기본키 속성은 null이 될 수 없다.
참조무결성은 외래키 값은 null 이거나 참조 릴레이션의 기본키 값과 동일해야함
45. ER 다이어그램의 기호
|: 1개 / 실선은(dash) ‘1'을 나타낸다.
∈: 여러개 / 까마귀 발(crow’s foot or Many)은 ‘다수' 혹은 '그 이상'을 나타낸다.
○: 0개 / 고리(ring or Optional)은 ‘0'을 나타낸다.
- Type1(실선과 실선): 정확히 1 (하나의 A는 하나의 B로 이어져 있다.)
- Type2(까마귀발): 여러개 (하나의 A는 여러개의 B로 구성되어 있다.)
- Type3(실선과 까마귀발): 1개 이상 (하나의 A는 하나 이상의 B로 구성되어 있다.)
- Type4(고리와 실선): 0 혹은 1 (하나의 A는 하나 이하의 B로 구성되어 있다.)
- Type5(고리와 까마귀발): 0개 이상 (하나의 A는 0또는 하나 이상의 B로 구성되 있다.)
46. Spring 과 STS 의 차이점
Spring : 자바 플랫폼을 위한 오픈소스 애플레이케이션 프레임워크
STS : 스프링 프레임워크 기반 개발을 지원하는 통합개발환경
즉, 스프링 프레임워크 사용에 최적화된 eclipse
47. Spring의 주요 기능
IoC : Inversion of Control(제어의 역전)
스프링을 쓰기 전에는 개발자가 프로그램 흐름을 제어하는 주체였다.
스프링에서는 프로그램의 흐름을 프레임워크가 주도한다.
객체 생성과 생명주기 관리를 컨테이너가 맡는다.
제어권이 컨테어너로 넘어가게 된 것이고 제어권의 흐름이 바뀌었다고 하여 IoC(Inversion of Control) 이라고 한다.
제어권이 컨테이너로 가면서 DI(의존성 주입) 과 AOP(관점 지향 프로그래밍) 이 가능하다.
DI : Dependency Injection(의존성 주입)
의존성이 있다라는 건 어떤 의미일까?
만약 메인클래스에서 어떤 클래스의 객체를 생성하여 사용하는 경우
나는 어떤 클래스에 의존성을 가지고 있다는 것을 의미한다.
원래 프로그래밍은 의존성 주입을 내가 했는데 제어의 역전은
객체 간의 의존성을 자신이 아닌 외부에서 주입하는 개념이다.
내가 직접 주입하는게 아니라 xml같은 외부에서 주입한다.
그래도 이해가 잘 가지 않는다?
예를 들어 보자
1.
원래대로라면 클래스 파일를 만들고 클래스 필드에 객체를 만들어서 필요한 곳에서 사용하는 방식이었다.
즉 필요한 곳에서 필요할 때마다 new 키워드를 써서 생성해서 사용했다는 것
하지만 문제점은 그럴 경우 비슷한 다른 종류의 클래스를 만들거나 클래스 파일을 수정해야하는 일이 생기면
클래스 객체를 사용하는 곳에서 일일히 다 수정해야 한다.
예를 들어 여기저기서 약 100개의 클래스를 주입하는 부분이 있는데 수정할 일이 생긴다면
다 찾아가서 일일히 수정해야함..
2.
그래서 이걸 막기 위해 인터페이스를 이용하는건데
인터페이스를 사용해도 문제인 것이
필드는 인터페이스를 써서 한층 편해지겠지만
객체를 만들기 위해 new 키워드를 쓰는 부분에서는
클래스 이름을 넣어야 해서 여전히 클래스가 바뀌면 수정해야하는 건 똑같다.
3.
단점을 해결하기 위해 스프링의 xml을 사용하게 되면
메인 앱에서는 필드 부분은 여전히 인터페이스
2번에서 문제였던 객체 생성 부분에서는 xml의 빈 id 와 인터페이스를 입력하면 된다.
이럴 경우 프로그램이 객체가 필요할 때 xml을 참조하여 보게 되고
id에 따라 지정된 클래스가 있으니
내가 A란 클래스를 B란 클래스로 바꾸고 싶다면
xml에서 A를 가리키는 id 부분에서 B로 바꾸면 된다.
일일히 수정할 필요 없이 xml에서 바꾸기면 하면된다.
메인 앱에서는 생성하는 부분은 신경 안 쓰고 사용하기만 하면 된다.
왜냐하면 클래스를 가리키는 부분은 xml이 해주기 때문이다.
수정할 경우 메인 앱에서 수정할 필요 없이 xml 에서 수정하면 된다.
AOP 는 무엇일까
Aspect Oriented Programming
어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다.
Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하는 것
Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
스프링 aop의 특징은
프록시 패턴 기반의 AOP 구현체
프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해
스프링 빈에만 AOP를 적용 가능
모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 ...)에 대한 해결책을 지원하는 것이 목적
dmz 개발창고 :: IOC와 DI 에 대하여 (스프링 개념 이해하기 쉽게 설명) (tistory.com)
50. Spring MVC 의 주요 구성요소
Model : 데이터베이스와 상호작용하며 비즈니스 로직을 처리하는 모듈
View : Client에게 보여지는 화면을 반환하는 모듈
Controller : Client 요청이 들어오면 입력을 처리하고 어떤 로직을 실행할 지 제어하는 모듈
1) DispatcherServlet이 client의 request를 받음
2) HandlerMapping이 알맞은 Controller를 찾음
3) HanlderMapping이 실행할 Controller 메소드를 찾음
4) Controller 메소드를 실행하고 그 결과 Model 과 view name을 DispatcherServlet에게 전달
5) ViewResolver 가 알맞은 JSP 파일을 찾음
6) View는 JSP 파일을 Model 정보를 토대로 Client에게 반환
7) 반환
51. Annotation의 기능
자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다.
즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다.
메타데이터 : 데이터를 위한 데이터
자바 코드에 포함된 메타데이터 설정 객체(interface의 일종)
- 컴파일러를 위한 정보를 제공하기 위한 용도 (@Override 등)
- 컴파일 과정에 어노테이션 정보로부터 코드를 생성하기 위한 용도
- 런타임(실행)에 리플렉션을 이용해서 특수 기능을 추가하기 위한 용도 (@Controller 등)
변형된 interface의 일종으로써 메타데이터 용도로 사용. 프로그램 소스 코드에 삽입.
servlet 2.5 이하의 방식으로 작성 : XML 메타데이터 설정.
servlet 3.x 이상의 방식으로 작성 : annotation 설정 : 코드량이 단축(간편).
ex) myBatis Mapper 기능 : SQL 구문 -> annotation
52. Spring 에서 유효성 검사
1) Spring Validator 인터페이스 구현 -> validate 추상함수(메소드) 오버라이딩.
2) JPA(JEE 표준 ORM) 폼점검 API(JSR-303 규격(자바빈 유효성 점검 규정)을 따름)
--> annotation 형식의 폼점검 도구를 지원.
53. Spring 커스텀 태그를 사용하는 이유
JSP내에서 데이터와 코드를 분리시키는 역할
코드 간결화, 데이터 입출력 용이
코드의 재사용을 가능
스크립트 요소(스크립틀릿, 표현식 등)가 많아질수록 JSP 코드는 복잡해진다.
커스텀 태그를 이용하여 위 문제점을 해결
54. Spring Locale 기능
Spring 프로젝트에 다국어를 지원할 수 있게 설정
55. Spring tiles 기능
웹페이지의 상단, 하단, header, footer, left 등 반복적으로 사용되는 부분의 정보를 모아서 관리
반복되는 부분을 설정파일로 한 번만 설정하고 수정시 설정 파일 일부를 변경해도 모든 tiles 페이지 적용
56. ORM
자바 객체를 ORM 프레임워크가 RDB에 적절한 형태로 변환하거나 RDB 정보를 객체에 다루기 쉬운 형태로 변환하는 기술
ex) iBatis, myBatis, JPA, Hibernate, Spring JDBC
57. Spring에서 데이터베이스 연동
공유 가능한 스프링 빈(bean) 형태로 등록된 DataSource 즉 메타데이터(xml, annotation)를 통해 활용한다.
등록된 DataSource는 ORM(MyBatis 등)의 Session 객체와 연동한다.
이를 DAO 라는 비즈니스 로직 객체를 통해 연동하고 CRUD 메서드를 작성해서 DB 작업
기본적으로 Spring 자체 JDBC 라이브러리 사용 가능
별도 ORM 프레임웍을 사용하여 제어 가능.
58. Overriding 조건
1) 상속(클래스)/구현(인터페이스)을 전제로 한다.
2) 같은 이름의 메서드
3) 인자부가 같아야 한다.
4) 리턴형이 같아야 한다.
5) 접근 제어자가 부모 클래스(인터페이스) 보다 축소되어서는 안된다.
ex) 상속=단순한 계승이 아닌 확장(extends)로 간주
=> "접근 제어자" 축소(X)
6) 부모(조상) 클래스 보다 많은 수의 예외클래스를 가질 수 없다.
7) 부모(조상) 클래스 보다 더 넓은(포괄적인, 상위의) 예외클래스를 가질 수 없다.
59. Overloading
인자부(인수부, 매개변수부)의 변화, 즉 인자수/순서/자료형의 변화를
주어서 같은 이름의 메서드를 다양하게 사용하는 방법
60. Overriding 과 Overloading 의 차이점
- 공통점 : 같은 이름의 메서드를 대상으로 함.
- 차이점 :
1) overriding :
: 상속성을 전제로 하는 다형성
2) overloading :
상속성과 무관하게 인자부에 다양하게 변화를 줌.
61. Get/Post 차이점
1) get : URL을 통해서 인자 전달(보안상 위험),
인자 전송량 한계량이 브라우저별 편차 있음(대개 256byte ~ 4kb, 최대 8kb)
원래의 목적은 데이터(인자) 읽기(read) 전용
2) post : URL에 인자 전송이 노출없이 은닉되어 전송됨(상대적으로 안전)
인자 전송 한계량 없음(파일 업로드시에는 반드시 이것을 쓰는 것을 추천).
원래의 목적은 데이터(인자) 쓰기(write) 용도
62. TCP/ UDP 소켓의 차이점
1) TCP
연결형 서비스로 가상 회선 방식을 제공한다.
가상 회선 방식이란 뜻은 발신지와 수신지를 연결하여 패킷을 전송하기 위해 경로를 배정한다는 말
3-way handshaking과정을 통해 연결을 설정하고 4-way handshaking을 통해 해제한다.
3-way handshaking은 목적지와 수신지를 확실히 하여 정확한 전송 보장하기 위해 세션을 수립하는 과정
데이터 흐름제어나 혼잡제어
높은 신뢰성을 보장한다.
UDP보다 속도가 느리다.
전이중(Full-Duplex), 점대점(Point to Point) 방식.
서버와 클라이언트는 1대1로 연결된다.
스트림 전송으로 전송 데이터의 크기가 무제한이다.
패킷에 대한 응답을 해야하기 때문에(시간 지연, CPU 소모) 성능이 낮다.
Streaming 서비스에 불리하다.(손실된 경우 재전송 요청을 하므로)
이것을 하는 이유는 TCP는 연결형 서비스로 신뢰성을 보장하기 때문이다.
연속성보다 신뢰성 전송이 중요할 때 사용하는 프로토콜
2) UDP
비연결형 서비스로 데이터그램 방식을 제공한다
그 크기는 65535바이트로, 크기가 초과하면 잘라서 보낸다.
연결 자체가 없어서(connect 함수 불필요) 서버 소켓과 클라이언트 소켓의 구분이 없다.
소켓 대신 IP를 기반으로 데이터를 전송한다.
정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않는다.
UDP헤더의 CheckSum 필드를 통해 최소한의 오류만 검출한다.
흐름제어(flow control)가 없어서 패킷이 제대로 전송되었는지 확인할 수 없다.
신뢰성이 낮다
TCP보다 속도가 빠르다
서버와 클라이언트는 1대1, 1대N, N대M 등으로 연결될 수 있다.
파일 전송과 같은 신뢰성이 필요한 서비스보다 성능이 중요시 되는 경우에 사용된다
예를 들면 실시간 서비스(streaming)
63. class에 사용할 수 있는 접근 지시자와 일반 지시자
1) 외부클래스
접근제어자 : public, default, protected/private(불가)
일반지시자 : final, abstract, static(불가)
2) 내부클래스
접근제어자 : public, default, protected/private(가능)
일반지시자 : final, abstract, static(가능)
64. String -> int 형변환 방법
1) int의 wrapper 클래스인 Integer 생성자 활용
2) Integer의 parseInt() 활용
3) Integer의 valueOf() 활용
65. Stack /Queue 의 차이점
stack : 후입선출(LIFO),
예시) JVM에서 지역변수 저장, 웹브라우저의 이전/이후 버튼 기능,
수식계산, 수식괄호검사, undo/redo
queue : 선입선출(FIFO),
예시) 프린터 대기목록, buffer(버퍼)
66. 데이터베이스 동등 조인(equal join)
두 개 이상의 테이블에서 같은 키를 중심으로 동등 비교 연산자 혹은 natural join 등의 ANSI join 방법 등을 이용하여 테이블들의 정보를 획득하는 방법
ex )
SELECT d.deptname, e.ename FROM dept d, emp e
WHERE e.deptno = d.deptno;
67. Class 와 객체의 차이점
객체지향(OOP)이론적인 관점에서는 객체가 큰 범위이며, 좁은 의미로 사용될 때 객체가 인스턴스를 가리키는 경우에는
Class가 더 크다.
클래스(class)는 객체 지향 프로그래밍(OOP)에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀이다. 객체를 정의 하기 위한 상태(멤버변수)와 메서드(함수)로 구성된다.
객체 - 현실의 대상, 인식할 수 있는 사물
클래스 - 객체를 정의하는 설계도/틀, 객체를 추상화해 디자인(설계)
인스턴스 - S/W 상의 실체, 메모리에 할당된 객체, 클래스로 생성, 객체라는 용어로 혼용
68. String API
StringBuffer
StringBuilder
StringTokenizer
69. substring, equals
equals 메소드
hashcode
객체 내용을 바탕으로 만들어진 난수처럼 보이는 객체 인식용 정수
객체가 서로 다른 내용을 갖고 있다면 달라야 한다. 반대로 객체 내용이 같으면 일반적으로 같은 값을 가진다.
해시코드는 객체를 해시테이블에 저장하는 경우에 사용한다.
해시코드는 객체를 골고루 저장할 수 있게 한다.
자료를 찾을 때 빠르게 찾을 수 있도록 도와준다.
이것은 해시테이블의 기능
하지만 같은 내용인 클래스 객체를 만들고 해시코드를 출력하면 다른 해시코드가 나온다.
왜 해시코드가 다르게 나올까?
그 이유는 객체가 만들어지면 힙 메모리에 저장되는데 다른 공간에 위치하기 때문이다.
String 클래스는 안에 있는 내용이 같으면 해시코드가 같게 hashCode( ) 를 재정의
그리고 equals는 내용값이 같으면 같다고 재정의
하지만 Object 클래스는 hashCode( ) 재정의 하지 않았다.
내용이 같아도 메모리 위치가 달라서 해시코드가 다르게 나온다.
(참고로 클래스를 만들때 Object 클래스를 상속받도록 설정되어있다.)
게다가 equals( )도 재정의를 안해서 객체 참조값(주소값)이 같은지 비교한다.
따라서 equals를 재정의하지 않은 object 클래스 객체는 연산자 == 와 같은 기능을 한다.
String 클래스는 재정의 했기 때문에 연산자 == 와 equals( ) 와 다르다.
그러므로 Object 클래스 객체 내용이 같은지 검사하려면 equals 메소드를 오버라이드해야 한다.
String 클래스 말고 일반적인 Object 클래스에서 equals( )는 주소값이 같은지 다른지 확인하는 용도이다.
먼저 안의 내용이 같으면 해시코드가 같게 나오도록 재정의 해주고
내용이 같으면 참값이 나오게 해주는 equals( )를 재정의 해준다.
사족)
객체.hashCode( ) 로 출력하면 int 형으로 10진수가 나오고
toString( )으로 출력하면 해시코드가 16진수로 표현된다
70. Java Bean
Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다.
우리가 new 연산자로 어떤 객체를 생성했을 때 그 객체는 빈이 아니다.
ApplicationContext.getBean()으로 얻어질 수 있는 객체는 빈이다.
즉 Spring에서 빈은 ApplicationContext가 알고있는 객체,
즉 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미한다.
Spring ioc 컨테이너에 빈을 등록하는 방법
1. Component Scanning
2. 빈 설정 파일에 직접 빈을 등록
Spring IoC(Inversion of control : 제어의 역전) 가 있기 전에는
우리가 직접 클래스 객체를 직접 만들고 사용했지만
이제는 만들지 않고 사용하기만 한다.
갖다 주는 건 스프링이 한다.
스프링이 가지고 있고 우리는 손바닥을 벌리면 스프링이 꽂아준다.
스프링이 webApplicationContext 파일에 클래스를 갖고 있다가 Autowired가 있으면 맞는 것을 거기에 보낸다.
클래스 레벨에서 @Configuration 가 있으면 스프링 IoC 컨테이너에게 이 클래스는 자바 빈을 등록하는 클래스임을 알린다.
그 클래스 안에 @Bean으로 객체들을 빈으로 등록한다.
다른 방법으로 주로 @Component @Service @Repository 등의 어노테이션을 이용하여 빈을 등록한다.
그리고 @Autowired 이 있는 곳에 빈을 주입한다.
@Component 는 스프링 IoC 컨테이너에 관리되는 자바 빈(객체)임을 표시하는 기본 어노테이션이다.
주로 DTO, VO 클래스에 주로 사용한다.
@Service 는 비즈니스 로직이나 영속성 계층(Repository Layer)의 클래스를 호출하는 클래스에 사용된다. Component와 기능 동일
@Repository 는 DB 쪽 데이터 처리를 위한 Data Repository, DAO 클래스임을 나타내는 어노테이션이다.
Component와 기능 동일하지만 @Repository는 발생되는 Unchecked Exception을 Spring Runtime 예외인 DataAccessException 으로 처리할 수 있게한다.
DataAccessException은 DAO에서 상용구 catch and throw 블록 및 예외 선언을 작성하지 않고 예외를 처리할 수 있다.
Java bean은 JSP 페이지의 디자인 부분과 로직 부분을 나눠서 자바코드를 줄이고 프로그램 재사용성을 증가시킨다.
반복되는 코드를 따로 작성하여 재사용하기 위해 만들어진 클래스이다.
빈은 속성과 메서드로 이루어져 있으며 데이터 처리를담당한다.
71. 바이트 코드 생성 시 JVM이 Heap 메모리에서 처리하는 과정
1) Class Loader
자바에서 소스를 작성하면 .java파일이 생성된다.
.java 소스를 자바 컴파일러가 컴파일하면 .class 파일(바이트코드)가 생성된다.
생성된 클래스 파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할을
Class Loader가 한다.
2) Execution Engine
Class Loader에 의해 메모리에 적재된 바이트 코드들을 기계어로 변경하여 명령어 단위로 실행하는 역할을 한다.
명령어 하나 하나 실행하는 Interpreter 방식이 있고 JIT(Just In Time) 컴파일러를 이용하는 방식이 있다.
JIT 컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다.
3) Garbage Collector
Garbage Collector(GC)는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
GC가 역할을 하는 시간은 정확히 언제인지를 알 수 없다.
또 다른 특징은 GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 모든 쓰레드가 일시정지된다.
특히 Full GC가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어지는 치명적인 문제가 생길 수 있는 것이다.
4) Runtime Data Area
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
Method area
Class Loader가 적재한 클래스(또는 인터페이스)에 대한 메타데이터 정보가 저장된다.
클래스 생성자 및 메소드의 코드(바이트 코드) 등 이 저장된다.
클래스의 인스턴스가 생성된 후, 메소드가 실행되는 순간 클래스의 정보가 Method Area 에 저장된다.
Method Area는 모든 Thread에 의해 공유되는 영역 이며, JVM이 시작될 때 생성된다.
heap area
인스턴스와 배열이 동적으로 생성되는 공간
new 연산자 등으로 생성된 객체 등 을 저장하는 영역이다.
Heap 영역에 저장된 객체(인스턴스)나 배열은 다른 객체에서 참조될 수 있다.
GC 가 발생하는 영역이며, 참조(레퍼런스)가 없는 객체들은 GC과정을 통해 메모리에서 제거된다.
Heap 영역 또한 내부적으로 여러 영역으로 나뉘어져 있으며, 이는 객체의 lifecycle 및 GC 와 연관되어 있다.
모든 Thread가 공유하기 때문에 동기화 문제가 발생할 수 있다.
garbage collector의 작동원리는 아래 영상으로 이해하자
java stacks
지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역이다.
스택영역에 생성된 p의 값으로 힙 영역의 주소값을 가지고 있다.
메소드를 호출할 때마다 개별적으로 스택이 생성된다.
pc registers
Thread(쓰레드)가 생성될 때마다 생성되는 영역으로 Program Counter
즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.
Java의 PC Register는 CPU 내의 기억장치인 레지스터와는 다르게 작동한다.
(Register-Base가 아닌 Stack-base로 작동)
바이트코드는 여러 명령들이 나열된 형태가 된다.
JVM은 이러한 명령을 하나씩 실행하며, Java 애플리케이션을 실행한다.
native method stacks
Java 외의 언어로 작성된 네이티브 코드들을 위한 stack
72. 인스턴스(객체) 생성법
참조 자료형은 인터페이스 또는 클래스가 앞에 오고 객체 변수인 인스턴스가 뒤에온다.
동적 변수 생성 연산자인 new 와 생성자가 연동되어 인스턴스를 생성한다.
73. html에서 셀을 나눌 경우 쓸 수 있는 속성
colspan, rowspan
74. 자바에서 전역 변수와 지역변수
멤버 필드가 전역 변수
블럭 및 메서드 내부는 지역 변수
75. 라이브러리, API, 프레임워크
라이브러리 :
특정 기능에 대한 도구 또는 클래스 인터페이스들의 집합
프로그래머가 기능을 수행하기 위해 도움을 주는 역할
API :
정형화된 사용 설명서를 포함한 라이브러리
라이브러리는 컴포넌트 자체를 의미하고 API는 컴포넌트를 활용하기 위한 규약이다.
API는 소프트웨어 구성요소(컴포넌트)와 가능한 상호 작용 사양이다.
작업을 수행할 수 있는 정보
프레임워크 :
프로그래밍을 진행할 때 필요한 코드와 알고리즘 등 어느 정도 구조를 제공함.
프로그래머는 이 프레임워크 뼈대 위에서 코드를 작성하여 개발한다.
API 형태이고 프레임워크 만의 프로그래밍 방식을 제시한다.
프레임워크는 가져다 사용하는 게 아니라 들어가서 사용한다는 느낌이다.
라이브러리는 가져다가 사용하고 호출하는 용도이다.
76. Tomcat 과 Apache의 차이점
Web Server 아파치
웹브라우저 클라이언트부터 HTTP 요청을 받아 정적 컨텐츠(html, jpeg, css 등) 를 제공하는 프로그램
Web Application Server 톰캣
웹 컨테이너 혹은 서블릿 컨테이너라고 불린다.
웹 서버와 웹 컨테이너의 결합으로 다양한 기능을 컨테이너에 구현
웹 컨테이너는 클라이언트 요청이 있을 때 내부 프로그램으로 결과를 만들고 클라이언트에게 돌려준다.
내부 프로그램은 JSP와 서블릿, 서블릿의 수명 주기 관리, 요청 URL을 서블릿 코드로 매핑, HTTP 요청 수신 및 응답, 필터 체인 관리 등
아파치와 톰캣의 차이점은
웹서버와 웹 애플리케이션의 차이
웹서버는 정적 데이터, 단순 이미지와 단순 HTML을 처리하는 서버는 빠르고 안정적
WAS 는 동적 데이터 , DB 연결, 데이터 조작 등과 같은 처리
왜 톰캣이라고 안하고 아파치 톰캣이라고 할까?
톰캣에서 아파치 기능을 포함하고 있기 때문에 (웹서비스 데몬, httpd)
그러나 톰캣이 아파치의 모든 기능을 갖고 있는 건 아니다
DB 조회나 다양한 로직 처리를 요구하는 동적 컨텐츠를 제공하기 위해 만들어진 Application Server
HTTP를 퉁해 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어(소프트웨어 엔진)
Container란 JSP, Servlet을 실행시킬 수 있는 소프트웨어
WAS는 JSP, Servlet 구동 환경을 제공한다.
WAS = Web Server + Web Container
웹서버의 기능을 구조적으로 분리하여 처리하고자하는 목적
분산 트랜잭션, 보안, 메시징, 쓰레드 처리 등 기능을 처리하는 분산 환경에서 사용된다.
주로 DB 서버와 같이 수행
프로그램 실행 환경과 DB 접속 기능 제공
여러 개 트랜잭션(논리적 작업 단위) 관리 기능
업무 처리하는 비즈니스 로직 수행
Web Server 가 필요한 이유?
웹 서버에서 정적 컨텐츠만 처리하게 하여 서버 부담을 줄인다.
WAS가 필요한 이유?
웹페이지에는 정적 컨텐츠와 동적 컨텐츠가 존재한다.
요청에 맞게 동적 컨텐츠를 만들어서 줘야 한다.
웹 서버만 이용하면 유저가 원하는 요청을 미리 만들어 놓고 서비스를 해야한다.
왜냐하면 웹서버는 정적 컨텐츠니까
그러나 자원이 부족하므로 이렇게 할 수 없다.
따라서 WAS로 요청에 맞게 데이터를 DB에서 가져와서 비즈니스 로직에 맞게 그때 그때 마다 결과를 만들어서 제공하여 자원을 효율적으로 처리할 수 있다.
WAS가 웹서버 기능도 모두 수행하면 안되나?
기능을 분리하여 서버 부하 방지
WAS는 DB 조회나 다양한 로직을 처리하느라 바빠서 단순 정적 컨텐츠는 Web Server가 빠르게 클라이언트에 제공하는 게 좋다. WAS는 동적 컨텐츠를 제공하기 위해 만들어졌는데 정적 컨텐츠까지 요청받아 처리하면 부하가 커지게 되고 동적 컨텐츠 처리도 지연된다.
물리적으로 분리하여 보안 강화
SSL 암복호화 처리에 Web Server 사용
[Web] Web Server와 WAS의 차이와 웹 서비스 구조 - Heee's Development Blog (gmlwjd9405.github.io)
'컴퓨터공학 > Java' 카테고리의 다른 글
Java maven project 개발 환경 구성 절차 (0) | 2021.09.16 |
---|---|
WAS에 요청이 올 경우 작동 원리 (0) | 2021.07.22 |
CS> 기술 면접 대비 기초 지식 모음 1 (0) | 2021.07.16 |
CS> 데이터베이스에 어떻게 이미지를 저장하고 가져올까? (0) | 2021.07.05 |
CS> JDBC connection 단계 (0) | 2021.07.05 |