[    JSP MVC패턴을 이용한 게시판 만들기 1(개요)    ]



 

전체적인 게시판 설게 구성도

 

클라이언트(브라우저에서의) 모든 요청은 FrontController에서 받게 되고, 요청을 받은 FrontController는 요청 분석을 해 필요한 처리르 담당하는 Command 객체를 지정하게 된다.

 

Command 객체들은 Service 인터페이스를 implements해 관리하며, 처리 요청을 받은 Command객체 내부에서는 DAO를 통해 DB에서 원하는 정보를 꺼내와 리턴하게 되고

 

꺼내온 정보를 담은 뒤 FrontController에서는 RequestDispatcher 를 이용해 forward시켜 원하는 화면(jsp 파일)으로 이동시켜 준다.

 

 

[ 테스트용 데이터베이스 구성 ]

 

STUDENT 테이블을 생성하고, mysql에서 auto_increment에 해당하는 sequence를 생성해 주도록 한다. 시퀀스는 삽입할 때마다 자동으로 컬럼을 증가시켜 넣어야하는 경우 주로 사용되는데

대표적으로 nextval : 다음에 삽입될 인덱스 번호, currval : 현재 마지막에 삽입된 인덱스 번호

등을 사용할 수 있다.

아래의 코드는 STUDENT 테이블을 생성하고 id를 기본키로 지정했고, 시퀀스를 이용해서 테스트용 데이터를 삽입했다

 

create table STUDENT(
  id varchar2(50) primary key,
  name varchar2(20) not null,
  address varchar2(100)
);

commit;

create sequence STUDENT_seq;

insert into STUDENT(id,name,address) values(STUDENT_seq.nextval,'hyr','seoul');

commit;

select * from STUDENT;

 

[    JSP FrontController 패턴, Command 패턴, RequestDispatcher를 이용한 forward에 대하여...    ]





- FrontController 패턴이란?

모든 요청을 하나의 서블릿 파일에서 받아서 처리하는 방식


- Command 패턴?

FrontController에서 받은 요청을 분석해 어떤 처리가 필요한지에 따라서 각 처리에 필요한 Command 객체를

할당해 그곳에서 처리한 뒤 필요한 데이터를 가지고 FrontContrller로 보내주고 그 데이터를 request 객체 등에

세팅해 RequestDispatcher 객체를 통해서 화면 전환시 request, response 객체를 함께 전달해주는 방식

이때, RequetDispatcher 객체의 특징!!

: 현재 페이지의 request, response 객체를 그대로 전달할 수 있다.!



- frontControllerEx.jsp
: 하나는 insert.do로 하나는 delete.do 라는 uri로 요청을 하고 있다. 단 둘 다 .do로 끝나는 패턴을 채택하고 있다.



- FrontController.java
.do로 끝나는 모든 요청을 받을 수 있도록 @WebServlet을 통해 서블릿 맵핑이 되어 있다.
또한, get방식이든 post 방식이든 모두 actionDo라는 메서드를 수행하도록 되어 있고 해당 메서드에서는
요청받은 uri를 가지고 와서 어떤 작업이 필요한지 command를 분석한다.

분석하고 처리에 필요한 Service를 지정해 해당 service에서는 dao에 접근해 데이터를 처리하고 FrontController로 반환해준다.
service를 통해 가지고 온 데이터는 request 객체에 저장하고
해당 requets 객체와 response객체를 데이터를 뿌려줄 화면으로 전달하기 위해
RequestDispatcher 객체를 사용해서 전달해준다.
이 객체의 특징은 현재 페이지의 request, response 객체를 그대로 전달할 수 있다는 점이다!!


- Service 인터페이스
: 다형성 적인 측면과 코드의 관리적 측면 때문에 모든 커맨드 객체들을 포함할 수 있도록 Service 인터페이스를 만들고
모든 Command 객체들은 이 Service 인터페이스를 implements 하도록 구현한다. 이때 execute 메서드를 재구현 할 수 있도록
execute 메서드를 선언해 놓는다.


- 각 처리에 필요한 Command 클래스 중 하나
: Service 인터페이스를 구현하고 execute 메서드를 재정의한다.
실재로 이 커맨드 객체에서 dao를 통해 DB에 접근해서 원하는 데이터를 가지고 오는 작업을 해야하지만
현재 코드에서는 생략하도록 하였다.


- FrontController에서 request 객체에 세팅한 값들을 가지고오는 페이지이다.



[    JSP JSTL(Java Standard Tag Liarary)    ]


JSTL은 Java Standard Tag Libarary의 약자로

EL가 같이 사용되어 스크립트릿과 태그를 번갈아 가며 작업할 때의 불편함을 없애기 위해 나왔다.

아래는 사용 예제이다.

하지만, 그 전에 

1. http://tomcat.apache.org/taglibs/standard/ 로 들어간다.


가장 안정적인 버전은 JSTL 1.1 버전이니, 이걸 다운받도록 한다.


2. binaries를 클릭하고, 1.1.1.zip을 받는다.




 다운을 받고 압축을 풀어 lib 폴더에 들어간다.


 두 파일을 복사하여 STS 프로젝트의 WebContent 폴더안의 Web-INF 안의 lib 폴더에 복사한다.


이렇게 까지 하면 세팅 완료 이제 jstl을 사용할 수 있다.


jstl을 사용하려면 <%@taglib 을 등록해주어야 한다. 여기서는 대표적으로 코어(c) 태그 라이브러리만 예제를 사용해 보겠다.



[    JSP EL(Expression Language) 표현언어    ]




EL : Expression Language 표현언어로 표현식, 액션태그를 통해 출력하는 것을 좀더 편리하게 출력할 수 있도록 해준다.



예제를 보기 전에 프로젝트 전체에서 사용할 초기화 변수를 web.xml에 등록하고



객체를 쉽게 가져올 수 있음을 테스트하기 위해 StudentDTO 빈즈를 만들어 놓고...



본격적인 EL 예제)
ELPractice.jsp



- ELPractice2.jsp



[ JSP 파일업로드 ]




jsp에서 파일업로드를 지원하는 라이브러리는 다양한 것들이 있지만 대표적인 것이 cos.jar이다.

해당 라이브러리를 다운받는 사이트는 http://servlets.com/cos/   에서 스크롤을 내리다보면 다운로드가 있다.

해당 파일을 다운로드해서 압축을 풀어 lib에 들어가보면 cos.jar파일이 보이는데 해당 파일을

자신의 프로젝트의 WEB-INF/lib 폴더에 넣고 동기화를 해주면 된다.


- [ 파일 업로드 폼 ] : fileUploadForm.jsp



이때, 파일을 저장할 디렉토리가 필요함으로 프로젝트 WebContent 하위에 uploadFile 폴더를 하나 만들자

이제 이 폴더에 업로드한 파일이 저장되도록 할 것인데, 프로젝트 내에 위치했다해서 워크스페이스 내에 있는 것이 아니다!!

실제 파일의 위치는 자신의 톰캣 서버 내의 프로젝트 폴더 내에 위치하고 있다는 점을 알아야한다.

만약 정확히 모르겠다면 jsp페이지에서 절대경로를 찍어보면 된다.




- fileUpload.jsp 
: 파일 업로드




-fileCheck.jsp
: 파일 체크 페이지








-fileDown1.jsp
: 파일 다운 페이지


'스터디 > JSP' 카테고리의 다른 글

JSP JSTL(Java Standard Tag Liarary)  (0) 2017.08.18
JSP EL(Expression Language) 표현언어  (0) 2017.08.16
JSP 커넥션 풀(Connection Pool)  (0) 2017.08.16
JSP DB(데이터베이스)  (0) 2017.08.14
JSP 자바 빈즈(JAVA BEANS)  (0) 2017.08.14
커넥션 풀이란?

: jsp에서 데이터베이스와 관련된 처리를 할 때 가장 오래 걸리는 부분이 커넥션(Connection)을 생성하는 부분이다.

많은 사용자들이 요청할수록 그것은 더 심한데 그럴 경우 서버가 처음 로딩될 때 미리 일정량의 Connection 객체를

커넥션 풀에 생성해 두고 그곳에서 가져다 사용하고 반납하는 개념이다.

이때, 커넥션 풀에 생성한 커넥션들을 관리하는 객체가 DataSource라는 객체이다.


구현 방법)

먼저, 서버가 로딩될 때 생성해야 함으로 server의 context.xml 파일에서 작업을 한다.



- context.xml
이곳에 아래의 소스코드를 추가한다.
driverClassName, url, username, passowrd 등은 우리가 디비 연결시 필수적으로 필요했던 항목이고
maxActive는 미리 생성해놀 커넥션의 수이다.
maxWiat의 경우 미리 생성한 커넥션 이상의 요청이 들어왔을 때 추가로 커넥션을 생성할 때 최대 기다릴 수 
있는 시간을 설정하는 것이다. 즉 timeout 을 설정
type은 커넥션을 관리하는 DataSource이다.

- db 객체를 얻어오는 페이지



'스터디 > JSP' 카테고리의 다른 글

JSP EL(Expression Language) 표현언어  (0) 2017.08.16
JSP 파일업로드  (2) 2017.08.16
JSP DB(데이터베이스)  (0) 2017.08.14
JSP 자바 빈즈(JAVA BEANS)  (0) 2017.08.14
JSP 에러페이지에 대하여...  (0) 2017.08.11
[    JSP DB(데이터베이스)    ]





'스터디 > JSP' 카테고리의 다른 글

JSP 파일업로드  (2) 2017.08.16
JSP 커넥션 풀(Connection Pool)  (0) 2017.08.16
JSP 자바 빈즈(JAVA BEANS)  (0) 2017.08.14
JSP 에러페이지에 대하여...  (0) 2017.08.11
JSP 쿠키(cookie)에 대하여...  (0) 2017.08.11

[    JSP 자바 빈즈(JAVA BEANS)    ]







그렇다면 지금까지 살펴본 빈즈는 왜 사용하는 것일까?? 무엇인가 편리한게 있지 않을까?


그렇다. 빈즈를 이용하면 우리가 form 태그에서 input 태그 등을 이용해서 많은 값들을 submit으로 보낼 때


이러한 값들을 일일이 하나씩 request.getParameter("name") 등으로 가져오지 않고 한번에 빈즈 객체에 저장시킬 수 있다.


매우 편리하다!!


하지만, 조건이 있다. form태그에 있는 input 태그 등의 name값과 빈즈의 필드변수명이 일치해야만 한다.


아래의 예제를 보자.


-PeopleBeans 클래스



-beansMain.jsp : 폼태그가 있는 페이지


-beans.jsp : 폼태그에서 서브밋해 데이터를 전달받을 페이지



'스터디 > JSP' 카테고리의 다른 글

JSP 커넥션 풀(Connection Pool)  (0) 2017.08.16
JSP DB(데이터베이스)  (0) 2017.08.14
JSP 에러페이지에 대하여...  (0) 2017.08.11
JSP 쿠키(cookie)에 대하여...  (0) 2017.08.11
JSP에서의 세션(session)에 대해서...  (0) 2017.08.11
[    JSP 에러페이지에 대하여...    ]


jsp 페이지 처리 도중 404, 500에러 페이지가 뜨면 일반 사용자에게 불쾌감을 줄 수 있어

UI등을 꾸며놓은 친숙한 에러페이지를 띄우도록 할 수 있다.

두가지 방법이 있는데

1. page 지시자를 이용한 방법

2. web.xml에 error-page 를 등록하는 방법이 있다.

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


[  1. page 지시자의 errorPage와 isErrorPage 속성을 이용한 방법  ]
main.jsp

errorPage.jsp







[ 2. web.xml에 등록하는 방식 ]


main2.jsp

web.xml에 등록하는 방식일 때는 page지시자의 errorPage를 사용하면 안된다.




web.xml
error-page 태그내에 404에러일 때 띄울 페이지, 500에러일 때 띄울 페이지를 지정했다.



error404.jsp
실재 404 에러 발생시 띄울 페이지이다.
response.setStatus(200) 은 꼭 해주도록 하자. 자동으로 500으로 세팅되어 제대로 에러 페이지가 호출되지
않을 수 있기 때문
200번 상태코드는 현재 페이지가 정상적인 페이지라는 의미이다.



'스터디 > JSP' 카테고리의 다른 글

JSP DB(데이터베이스)  (0) 2017.08.14
JSP 자바 빈즈(JAVA BEANS)  (0) 2017.08.14
JSP 쿠키(cookie)에 대하여...  (0) 2017.08.11
JSP에서의 세션(session)에 대해서...  (0) 2017.08.11
JSP 액션 태그(forward,include,param)  (0) 2017.08.10
actionTag.jsp


forward01.jsp



include02.jsp



request 내장 객체



response 내장 객체





include01.jsp



[HTML form 태그]




[Servlet]



[    servlet의 라이프사이클(lifecycle)    ]




해당 jsp 페이지 요청시 servlet java 파일로 변환을 하고 컴파일 해 servlet class로 만들고 해당 객체를 생성하는데
한번 객체가 생성되고 나면 이후 다른 Client 요청은 멀티 쓰레드로 처리하게 된다.


Servlet의 라이프 사이클)

Servlet 객체 생성         -   최초 한번 생성
    |
@PostConstructor 호출 -   생성자 이후, init 메서드 이전에 호출
    |  
init() 메서드 호출         -   최초 한번 호출
    |
doGet()/doPost() 호출   -   요청시마다 호출
    |
destroy() 호출             -    마지막 한번(자원 해제)
    |
@PreDestroy 호출        -   destroy() 이후 호출



[ Servlet Mapping ]



- Servlet 문서는 자바로 된 웹 프로그래밍 문서로서 MVC 패턴에서 Controller를 담당한다.


이때, 특정 URL로 요청시 해당 Servlet 문서가 동작할 수 있도록 Mapping(맵핑) 작업을 해주어야 하는데 이와 같은 작업에는

두가지 방식이 있다.


- [ Mapping 방식 ]

1. web.xml 에서 맵핑 설정하기


2. Annotation(어노테이션)을 이용하기


먼저, web.xml에서 맵핑을 설정할 경우

해당 Servlet 문서를 생성한 뒤, web.xml에 들어가서

다음과 같이 설정한다.

아래는 Helloworld라는 Servlet class 파일에 대한 맵핑을 설정한 것이다.



두번째로 어노테이션을 이용한 맵핑 방식이다.

@WebServlet 의 괄호 안에 맵핑할 URI 패턴을 적어준다.

현재 프로젝트의 컨텍스트 패스가 /ex임으로 http://localhost:80/ex/hw 로 해당 Servlet 문서가 맵핑된다.



1. http://www.sba.seoul.kr:80/kr/index?contries=seoul

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

     1                2          3       4             5


1) 프로토콜 : 통신 규약 ex) http, https, FTP, SMTP ...

2) IP : 컴퓨터를 구분해주는 컴퓨터 주소 부분 but 쉽게 인식할 수 있도록 DNS로 표시

-> www.naver.com 등이 다 도메인이고 DNS를 통해 IP주소로 변환된다.

3) port : IP가 컴퓨터를 구분해 준다면 port는 해당 컴퓨터에서 프로그램을 구분해주는 주소 80번은 웹 default 포트이다.

4) context path 및 URI 부분

URL vs URI

: URL은 위와 같은 풀 경로를 가리키고 URI는 컨텍스트 패스 이후부터의 경로를 의미한다.

5) Query 문자열 : GET방식으로 데이터를 넘길 때 붙는 부분



2. [ 웹서버와 WAS(Web Application Server) 간의 차이 및 동작 방식 ]


- 웹서버 : 정적인 서비스를 지원해 준다. 단순히 HTML 문서 등을 응답할 때 사용

- WAS(Web Application Server) : 동적인 서비스를 지원해 준다. JSP페이지 등에서 DB 접근하고 특정 로직을 수행하는 등 동적인 처리후 응답을

   해줄 경우 이용된다.

=> WAS에서 웹서버의 역할을 할 수 있음에도 웹서버와 WAS를 분리시킨 이유?

: 간단 간단한 정적 페이지에 대한 요청을 웹서버가 처리해줌으로써 트래픽이 WAS로 전부 쏠리는 걸 분산시켜 처리하기 위해서


[ 기본적인 웹 동작 방식 ]

Client 브라우저(크롬,IE,사파리...) -request-> 웹서버 -> WAS(Web Application Server) -> DB

   <-response            <-                                        <-


3. [ JSP와 Servlet의 관계 ]


- JSP : 

HTML 문서 내에 자바 코드를 포함하는 문서로

- JSP페이지는 Servlet 으로 변환된다.

- MVC 패턴에서 View를 담당한다.


- Servlet :

JAVA언어로 웹프로그래밍 문서로

- MVC 패턴에서 Controller를 담당한다.



4. [ JSP에서의 MVC 패턴 ]


MVC 패턴

: Controller(Servlet 문서)

  Model <-> DB

  View(JSP 문서)

  로 분리하여 화면(View)와 데이터 처리를 분리시킨 방식으로 JSP에서는 Servlet이 Controller를 JSP 문서가 View를 

  담당하는 것이 일반적이다.



5. [ Client Request에 따른 JSP 처리 로직 ]


: Client Browser(크롬,IE,사파리...)에서 단순히 정적인 HTML 페이지 요청시 웹서버는 바로 HTML 페이지를 Response(응답)해 준다.

하지만, 동적인 작업이 필요한 특정 JSP페이지를 요청시(ex helloworld.jsp) 웹서버는 WAS로 요청을 보내게 되고

WAS는 컨테이너에 해당 JSP페이지에 대한 Servlet 객체가 있는지를 확인한다 있다면 해당 Servlet 객체의 doGET, doPOST 메서드를 통해

최종적으로 HTML 문서를 Client에게 응답하게 된다.


하지만, 요청한 JSP페이지에 대한 Servlet 객체가 존재하지 않는다면

우선, 요청한 JSP 페이지(helloworld.jsp)를 Servlet 자바 파일로 변환하게 된다.(helloworld_jsp.java)

그 뒤, 해당 Servlet 자바 파일을 컴파일 해 helloworld_jsp.class 와 같은 클래스 파일로 변환하게 되고

해당 class를 기반으로 Servlet 객체를 생성해 메모리에 적재하고 doGET, doPOST 메서드를 수행하여

최종적으로 Client 브라우저에 HTML 문서의 형태로 Response(응답)을 해주게 된다.




 


[    웹개발(JAVA,JSP,Spring) 관련 예상 면접 질문    ]




웹 개발 면접시 인성 질문, 자기소개, 프로젝트 내용 질문을 제외한 JAVA와 관련된 기술 예상 면접 질문을 정리해 보았습니다.



1) 자바의 특징에 대해 말해보시오.

1) OOP(객체 지향 언어) 

: 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립해 전체 프로그램을 완성하는 개발 기법

2) "가비지 컬렉션"에 의한 메모리 자동 관리

3) "멀티 쓰레드"를 지원한다.

4) JVM 위에서 동작하기 때문에 특정 OS에 종속적이지 않고 이식성이 좋으며, 보안성이 좋다.

5) 다양한 Open 라이브러리들이 존재한다.



2) 자바를 만든 사람에 대해 아시나요?

: "제임스 고슬링"



3) 변수란?

: "하나의 값을 저장할 수 있는 메모리 공간"



4) 객체와 클래스의 차이점에 대해 설명해 보시오.

- 클래스(Class) : 현실 세계의 객체의 속성과 동작을 추려내 필드와 메서드로 정의한 것으로 "아직 메모리가 할당되지 않은 상태"

vs

- 객체(Object) : 이 Class라는 설계도를 기반으로 실제 메모리가 잡힌 것을 의미하며 이런 객체를 조합해 전체 프로그램을 완성해

   나가는 방식을 OOP(객체지향 프로그래밍)이라고 한다.



5) 객체 지향 PG이란? 또 그 특징은?

: 현실세계의 객체를 필드와 메서드로 정의한 Class를 기반으로 실제 메모리가 잡혀 만들어진 부품과 같은 객체들을 조합해

  전체 프로그램을 완성해 나가는 개발 기법으로

특징)

- 캡슐화, 은닉화 : 외부 객체에서 구현방식은 알 수 없도록 숨기고 별도로 접근할 수 있는 getter/setter 메서드를 통해 접근하도록 하는 방식

- 상속 : 부모 Class를 자식이 접근할 수 있도록 물려 받는 방식

- 다형성 : 부모 클래스 타입으로 해당 부모를 상속받는 여러 자식 class를 대입할 수 있는 성질

등을 들 수 있다.



6) 다형성이란?

: 서로 다른 클래스로부터 만들어진 객체지만 같은 부모의 Class 타입으로 이들을 관리할 수 있는(=대입될 수 있는) 성질



7) 자바의 메모리 영역(간단하게 설명)

1. 메서드 영역 : static 변수, 전역변수, 코드에서 사용되는 Class 정보 등이 올라간다.

    , 코드에서 사용되는 class들을 로더로 읽어 클래스별로 런타임 필드데이터, 메서드 데이터 등을 분류해 저장한다.

2. 스택(Stack) : 지역변수, 함수(메서드) 등이 할당되는 LIFO(Last In First Out) 방식의 메모리

3. 힙(Heap) : new 연산자를 통한 동작할당된 객체들이 저장되며, 가비지 컬렉션에 의해 메모리가 관리되어 진다.



8) 추상메서드? 추상 클래스?

- 추상메서드 : 메서드의 정의부만 있고 구현부는 있지 않은 메서드

- 추상 클래스 : 추상메서드를 적어도 하나 이상 가지고 있는 클래스로 자식클래스에서 오버라이딩(재정의)가 필요한 추상메서드를 가지고 있기

        때문에 객체화 할 수 없다.



9) 인터페이스(Interface)란? 또 왜 사용하나?

: 인터페이스는 모든 메서드가 구현부가 없는 추상메서드로 이루어진 클래스로, abstract 키워드를 붙이지 않아도 자동으로 모든 메서드는 추상메서드로

  정의가 된다. 또한 변수도 자동으로 final static 키워드가 붙게 된다.


왜 인터페이스를 사용하는가? 

: 팀작업시 개발코드 부분과 객체가 서로 통신하는 접점 역할을 지원하게 되는데, 이는 개발코드에선 객체의 내부 구조를 모르더라도 인터페이스의

  메서드 명만 알고 있으면 되기 때문이다. 이를 통해 얻을 수 있는 장점은 해당 메서드를 통해 나오는 결과물을 알고 있기 때문에 다른 팀의

  작업을 기다리고 있지 않아도 되며, 또한 해당 객체가 수정될 경우 개발 코드 부분은 수정을 하지 않아도 된다.

  또한, 부가적으로 객체를 파일에 쓰기 위해 Serializable 인터페이스를 구현하거나, Collections.sort()를 하기 위해서 Comparable 인터페이스를 

  상속하는 것, Cloneable 을 구현하는 것처럼 특정 작업을 하겠다라는 "Mark"역할을 해주기도 한다.



10) 프로세스(Process) 와 쓰레드(Thread)의 차이점에 대해 아는가?

- 프로세스 : OS가 메모리 등의 자원을 할당해준 실행중인 프로그램을 가리킨다. 이때, 각각의 프로세스는 서로 메모리 공간을 독자적으로 갖기 때문에

    서로 메모리 공간을 공유하지 못한다. 따라서 공유하기 위해서는 IPC(InterProcess Communication)과 같은 방식이 필요하다.

- 쓰레드 : 쓰레드는 프로세스 내에서 프로세스의 자원을 가지고 실제로 일하는 "일꾼"과 같으며 각 쓰레드는 독자적인 Stack 메모리를 갖고 그 외의

  자원(메모리)는 프로세스 내에서 공유하게 된다.



11) 컬렉션프레임워크(CollectionFramework)에 대해 아는만큼 말해 보시오.


- Collection 인터페이스 

- List 인터페이스 : 배열과 유사하되, 추가할때마다 자동으로 Boundary를 늘려주는 구조로, 중복된 데이터를 허용하며, 순서가 존재한다.

ex) - ArrayList : 배열로 구현됬으며, 인접해 있기 때문에 데이터 조회에 매우 빠르다 하지만, 빈번한 삽입, 삭제시 새로 배열을 만들고 데이터를

옮겨야 하기 때문에 LinkedList에 비하여 속도가 느리다.

    - LinkedList : 링크 구조로 되어 있기 때문에 조회는 ArrayList에 비해 느리지만, 삽입 삭제시 링크를 끊고 새로 추가되는 데이터에 링크만

연결하면 되기 때문에 삽입, 삭제에 유리하다.

    - Vector : 구현 방식은 ArrayList와 유사하지만 Vector를 개선한 것이 ArrayList이다. 또한 Vector의 경우에는 ArrayList와 달리

Synchronized(동기화)가 걸려 있어 여러 쓰레드에서 동시에 접근할 수 없다.

- Set 인터페이스 : 집합처럼 중복된 데이터를 허용하지 않으며, 순서가 없다. 또한, 객체 내부의 중복된 데이터를 배제하고 싶은 경우

  Object 클래스의 equals 메서드와 hashCode 메서드의 재정의가 반드시 필요하다.

ex) - HashSet

    - TreeSet : 순서가 있는 HashSet으로 이진 트리 구조로 만들어 졌다. 순서에 맞게 정렬되어 저장되기 위해서 Comparable을 구현해야한다.

    


- Map 인터페이스 : key와 value 쌍으로 데이터를 저장하며, key는 중복될 수 없고, value는 중복 저장이 가능하다.

ex) - HashMap

     - TreeMap

     - Properties : key value 쌍으로 저장되지만 value의 타입이 String만 가능하다.

     - Hashtable : HashMap과 구조는 같으며, 단지 Synchronized(동기화) 되어져 있다는 점이 다른점이다.


12) 쿠키(Cookie)와 세션(Session)의 공통점과 차이점은?

- 공통점 : 둘 다 사용자의 데이터를 저장한다.

- 차이점

- 쿠키:  쿠키는 Client 컴퓨터에 저장했다 서버 요청시 네트워크를 타고 서버로 전달되기 때문에 보안에 취약하다.

- 세션 : 세션은 서버에 저장되고 브라우저 단위로 관리된다. 캐시에 비해 보안성이 좋다.


13) Request 전송 방식에는 어떤 것들이 있는지 아시나요?

- Get 방식 : URL의 쿼리문자열에 데이터를 같이 전달하는 방식으로 데이터 길이에 제한이 있고, 보안에 취약하다.

- POST 방식 : 헤더에 데이터를 넣어 보내기 때문에 보안에 조금 더 유리하고 데이터 길이에 제한이 없다. 하지만, Get에 비해 다소 느리다.

- DELETE 방식 : RESTFUL에서 삭제 기능을 할 때 주로 사용된다.

- PUT/PUSH 방식 : RESTFUL에서 수정 작업을 할 때 주로 사용된다.



14) RESTFUL이란?

: 해당 URL만 보더라도 바로 어떤 작업을 하는지를 알 수 있도록 하나의 데이터는 하나의 URL을 갖도록 작업하는 방식



15) Spring에서 DI란 무엇인지 아시나요?

: DI는 Dependency Injection(의존성 주입)의 약자로, 객체들 간의 의존성을 줄이기 위해 사용되는 Spring의 IOC 컨테이너의 구체적인 구현 방식입니다.

  DI는 기존처럼 개발코드 부분에서 객체를 생성하는 것이 아니라, 팩토리 패턴처럼 객체의 생성과, 데이터를 주입만 담당하는 Factory에 해당 하는 

 별도의 공간에서 객체를 생성하고 데이터간의 의존성을 주입해 개발코드에서는 이를 가져다 씀으로서 의존성을 줄이는 방식입니다. 이때, 

 Factory 패턴의 Factory Class의 역할을 스프링의 환경설정 파일이 담당합니다.



16) Spring의 AOP란?

: AOP는 Aspect Oriented Programming 관점 지향 프로그래밍의 약자로, 기존의 OOP(객체 지향 프로그래밍)에서 기능별로 class를 분리했음에도 불구하

 고, 여전히 로그, 트랜잭션, 자원해제, 성능테스트 메서드 처럼 공통적으로 반복되는 중복코드가 여전히 발생하는 단점을 해결하고자 나온 방식으로

 이러한 공통 코드를 "횡단 관심사"라 표현하며 개발코드에서는 비지니스 로직에 집중하고 실행시에 비지니스 로직 앞, 뒤 등 원하는 지점에

 해당 공통 관심사를 수행할 수 있게 함으로서 중복 코드를 줄일 수 있는 방식입니다.



17) Filter와 Interceptor 방식의 차이?



18) 디자인 패턴 아는 것?

1) 싱글톤(SingleTone Pattern) : 대표적으로 Calendar 객체나 dataSource 객체처럼 객체가 하나만 생성되어야 하는 경우

 전체 코드에서 하나의 객체만 존재할 수 있도록 이미 생성된 객체가 있으면 그 객체를 사용하도록 하는 방식입니다.

2) 팩토리 패턴(Factory pattern) : 객체간 의존성을 줄이기 위해 객체의 생성과 데이터 주입만 담당하는 Factory Class를 정의하고 개발 코드 부분에서는

   생성된 객체를 가져다 사용함으로서 의존성을 줄이는 방식입니다.

3) 옵저버 패턴(Observer Pattern) : 기후 정보처럼 RSS 수신시 하나의 객체가 변하면 다른 객체에 객체가 변했다는 사항을 알려주어야 할 경우에 주로

    사용됩니다.



19) MVC 패턴이란?

- Model : data 처리와 접근을 담당

- View : Client에 보여지는 화면을 담당

- Controller : Model과 View를 제어

하는 3가지 부분으로 나눔으로서, 데이터와 화면간의 의존관계를 벗어날 수 있게하는 개발 기법입니다.



20) 프로젝트 개발 순서??

대강...

1) 요구사항 분석 

기획 및 스토리 보드 작성

2) WBS(Work Breakdown Structure) 작성 : 작업 분해도로 프로젝트 범위와 최종산출물을 세부요소로 분할한 계층적 구조도

3) 논리 ERD 작성

4) 물리 ERD 작성

5) 개발

6) Testing

7) 유지보수



21) 오버로딩과 오버라이딩의 차이?

- 오버로딩 : 메서드 명은 동일하지만, 매개 변수 타입과 개수를 다르게 해 선언하는 방식

- 오버라이딩 : 상속한 자식에서 부모의 메서드를 재정의하는 방식


22) Servlet vs JSP

- Servlet : 자바 언어로 웹 개발을 위해 만들어진 것으로, Container가 이해할 수 있게 구성된 순수 자바코드로만 이루어진 것

- JSP : html 기반에 JAVA 코드를 블록화하여 삽입한 것으로 Servlet을 좀 더 쉽게 접근할 수 있도록 만들어 진 것


23) Wrapper Class의 사용이유를 아나요?

: 기본 data 타입은 객체가 아니어서 Object로 받는 다형성을 지원할 수가 없다. 하지만, 메서드에서 실재로 기본데이터 타입을 다형성으로

 넘겨주어야 하는 경우가 빈번히 발생하는데 이때, 기본 데이터 타입을 객체로 변환시켜 전달하기 위해 사용되며

 최근에는 AUTO Boxing, AUTO UnBoxing이 지원된다.



24) DataBase에서 Index란?

: Table에 대한 동작 속도를 높여주는 자료구조로서 빠른 검색을 가능하게 해준다.



25) private, protected, public, default 제어자에 대해 설명해 보시오

- private : 같은 class 내부에서"만" 접근이 가능하다.

- public : 어디서든 자유롭게 접근이 가능하다.

- protected : 같은 class 내부 + 상속받은 자식에서는 부모 class에 접근이 가능하다.

- default : 아무 것도 선언하지 않은 경우로 같은 패키지 내부에서만 접근이 가능하다.



26) SI가 무엇을 하는 건지 알고 오셨나요?

: System Integration의 약자로 시스템 통합 사업으로 고객의 기존 전산시스템을 통합하거나 새로운 시스템을 구축하는 작업입니다.



27) SW 개발시 가장 비중을 크게 두어야 할 부분은 어디라고 생각하나요?

: Testing 부분입니다. 



28) 자바의 제네릭이란??

: 클래스 내부에서 사용할 데이터 타입을 인스턴스(객체) 생성시에 결정짓는 방식


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

-> 여기까지는 제가 예상하는 면접 질문을 올리고 이 아래부터는 실제로 제가 기술면접 당시 받았던 질문들입니다.



[ 기술 면접 질문 ]

 

 

1. CVSSVN에 대해서 아는대로 설명해 보시오.

 

2. 64bit CPU32bit CPUOS적 관점에서의 차이를 설명해 보시오.

 

3. 프로세스와 쓰레드의 차이점에 대해서 설명해 보시오.( 메모리 구조 포함 )

 

4. ‘데드락이란 무엇이고 이를 해결하기 위한 방법을 설명해 보시오.

 

5. 변수 명명법이 중요한 이유에 대해서 설명하고 예를 들어 보시오.

 

6. 자바의 JVM의 역할에 대해서 설명해 보시오.

 

7. 자바의 특징에 대해서 말해 보시오.

 

8. Linux에서 톰캣 환경설정을 잡는 것에 대해 설명해 보시오.

 

9. WAS와 웹서버의 차이점은?

 

10. JqueryAjax에 대해 아는가?

 

11. 비동기와 동기 방식의 차이점에 대해서 말해보시오.(네트워크 동기,비동기 아님)

 

12. 개발시에 중요하다 생각하는 요소를 3가지 기술해 보시오.

 

13. 스프링의 MVC에 대해서 설명하시오.

 

14. AOP란 무엇이고 왜 사용하는지

 

15. ‘에자일방법론에 대해서 아는가?

 

16. 스프링 환경설정 혼자 잡을 수 있는가? 대강 어떻게 해야하는지 설명해 보시오.

 

17. 웹서버 내부 구동 방식에 대해 설명할 수 있는가?

 

18. 스프링 DI?

 

19. UML 그려본 적 있는가?

 

20. Node jsAngular JS를 사용해 본 적이 있는가?

 

21. 캐시와 세션의 공통점과 차이점에 대해 말해보시오.

 

22. 디자인 패턴 아는 것들만 간략히 설명해 보시오.

 

23. DataBase에서 index관련 질문이었는대 잘 모르겠어서..기억이..

 

24. 크롬이나 파이어폭스에서 개발도구를 사용해 디버깅을 해보았는가?

 

25. JDBC는 무엇인가?

 

26. 스프링을 사용하지 않고 MVCJSP에서 만들어 보았는가?

 

27. DB 옵티마이저에 대해 아는가?

[    스프링에서 구글맵 연동하기    ]



스프링에서 구글맵을 연동하는 방법을 알아봅시다.

1. 먼저 구글 API 키를 다음 url로 들어가 얻습니다.

https://console.developers.google.com/flows/enableapi?apiid=maps_backend,geocoding_backend,directions_backend,distance_matrix_backend,elevation_backend,places_backend&reusekey=true


생성된 키는 곧 사용되니 잘 보관하고 계시고요


2. 두번째로 뷰단에서 html 코드를 작성합니다.

<div id="map"></div> 이 부분이 구글맵이 들어갈 자리고, style안에 #map 부분은 구글맵 컨테이너에 대한 스타일을 지정하는 부분입니다.





3. script 쪽을 작성합시다.

getAddr() 함수 부분은 제 코드임으로 구글맵과는 연관성이 없음으로 빼주시면 되고요


function initMap() 부분에서 지도의 초기화화 그려주는 역할을 하게 됩니다.

<script async defer  src="https://maps.googleapis.com/maps/api/js?key=자신의API키를넣으세요&callback=initMap">

</script>

부분은 자신의 API키를 넣어서 map을 로딩하는 요청을 보낼 수 있도록하고, 해당 로딩이 완료되면 callback에 지정한 

initMap() 메서드로 콜백이 들어와 지도를 그려주게 됩니다.


나머지 마크에 대한 설정, 위도 경도 세팅에 대한 내용은 코드 주석을 참고하세요.



[    AJAX 통신시 컨트롤러에서 한글 문자열을 리턴해야할 경우 인코딩 문제    ]



자바스크립트에서 비동기로 ajax로 컨트롤러로 요청을 받아 db에서 값을 꺼내 문자열을 리턴할 경우, 한글 문자열을 리턴했을 때

ajax의 success:function(result) 안에서 result로 값을 받으면 ???? 로 한글이 깨지는 경우가 있다.

이럴 경우에는 컨트롤러에서 produces 부분을 지정해주면 된다.


코드를 보면


먼저, ajax 통신 부분이다. /board/category/getAddr로 요청을 보내고 




컨트롤러 부분이다.
컨트롤러에서 service.getAddr(userId)로 해당 사용자의 주소를 얻어온 뒤 그 주소를 반환하지만 한글로 반환하게 된다.
이 경우, ajax의 success:function(result) 에서 result 가 ????로 깨지는 것을 알 수 있다.

하지만, produces = "application/text;charset=utf8"을 지정해 줄 경우 한글을 인코딩해 보내서 깨지지 않고 처리할 수 있게 된다.





[    AJAX를 동기화, 비동기화 설정해서 처리하기    ]



: JAVASCRIPT AJAX를 사용할 때, 일반적인 경우 비동기로 통신을 하게 된다. 즉, 순서대로 처리되는 것이 아니라

 처리 순서를 보장할 수가 없다. 따라서 꼭 순서를 지켜서 처리해야하는 경우는 동기화 방식으로 처리하도록 설정해주어야 한다.

 그럼 어떻게 해야할까?


 우선, ajax 내에서 async : false, 로 지정할 경우 동기화 방식으로 보내고 true로 하거나 생략할 경우 비동기방식으로 통신이 이루어지  게 된다. 


+ Recent posts