Tomcat은 JSP 환경을 포함하고 있는 Servlet 컨테이너


Servlet과 jsp를 이용하여 로직을 처리한다


웹서버와 WAS는 이 처럼 동적데이터를 처리해주는 웹컨테이너의 유무 차이라고 보면 된다 


WAS = 웹 서버 + 웹 컨테이너

이미지 출처: http://gap85.tistory.com/45


사용자 요청(웹 브라우저) -> 웹 서버 -> WAS(동적 처리) -> 웹 서버 -> 사용자 응답 메세지(웹 브라우저)


웹 서버에서 JSP를 요청하면 톰캣에서는 JSP 파일을 서블릿으로 변환하여 컴파일을 수행하고, 서블릿의 수행결과를 웹 서버에서 전달하게 된다. 



출처: http://unabated.tistory.com/


Servlet이란

Servlet은 웹에서 JAVA 프로그래밍을 구현하기 위해 탄생 함.



서블릿(Servlet)

 - 자바 플랫폼에서 컴포넌트를 기반으로 한 웹 애플리케이션을 개발할 때 사용하는 핵심 기술.

   이러한 서블릿을 이용하면 웹 애플리케이션 확장이 용이하고 플랫폼에 독립적인 개발이 가능하다.

 - 쉽게 말하면 "클라이언트의 요구를 받아 그에 대한 처리를 한 후, 결과를 되돌려주는 서버 모듈"이다.


서블릿의 장점

1) 스레드를 기반으로 하기 때문에 웹 애플리케이션 운영에 효율적이다.

2) 자바를 기반으로 하므로 자바 API를 모두 사용할 수 있다.


웹 애플리케이션 개발시 서블릿 이용의 장점

1) 컨텐츠와 비즈니스 로직을 분리

2) 컨트롤러와 뷰 역할 분담으로 인해 웹 디자이너와 개발자간의 원활한 작업이 가능.

3) 유지보수가 수월, 기능 확장이 용이하다.

4) 현재와 같이 프로그래머가 HTML, 자바스크립트, 스타일 시트와 같은 복잡한 기술을 모두 알아야 할

    필요는 없다.

5) JSP에 HTML, CSS, 자바스크립트와 자바 소스 코드가 뒤섞이는 문제를 막는다.


동작 과정
1) 웹 서버는 클라이언트 요청을 컨테이너로 전달한다. 컨테이너는 서블릿이 메모리에 있는지 확인하고 없을시
   클라이언트 요청을 처리할 스레드를 생성해서 처리한다.
2) 서블릿은 JDBC를 이용해 데이터베이스에 접근할 수 있고, 별도로 제작된 자바 클래스를 통해 다양한 기능을 구현한다.
3) 서블릿에서 수행된 결과는 HTML 형식으로 클라이언트에 전달된다.

서블릿(Servlet)도 하나의 자바프로그램이긴 한데, 서블릿의 주된 업무는 사용자에게 정보를 입력받아 적절한 HTML 문서를 돌려주는 역할을 한다. 이러한 일을 하는 프로그램을 자바로 구현한 것이다. 사용자의 입력에 따라서 다른 HTML문서를 만들어내므로 동적인 HTML 문서를 구현할 수가 있게 된 것이다.

서블릿 규칙은 꽤 복잡하다. 따라서 이를 좀 더 쉽게 프로그래밍하기 위하여 나온 것이 JSP이다. JSP 문서를 실행시켜면 이 문서가 자동적으로 서블릿으로 컴파일되어 실행되게 된다.


이미지 출처: http://wiki.gurubee.net/pages/viewpage.action?pageId=26740202

.jsp -> .java -> .class -> .jsp


Servlet Container란

Servlet을 실행하고 생명주기를 관리하는 역할을 한다.

멀티 스레딩을 지원하여 클라이언트의 다중 요청을 알아서 처리해준다.

대표적인 Conatainer에는 Tomcat, jetty, jboss 등이 있다



출처: http://wan00ny.tistory.com/11

1. 기본적 타이핑실력과 영어실력

2. 버전관리의 습관

3. 알아보기 쉬운 변수명, 파일명, 디렉토리관리

4. 
반복되는 과정은 추상화할생각
반복되는 로직은 함수화, 클래스화 할 생각
반복되는 계산은 따로 저장해 두고 빠르게 꺼내기
반복되는 개념들은 따로 머릿속에 통암기하기

5.
이 코드가 하루 뒤, 일주일 뒤, 한달뒤, 일년 뒤쓰일 수 있는가?
이 코드가 남에게 알아보기 쉬운가?
내일 내가 이 코드를 남들에게 설명할 수 있는가?

그러니까 핵심은 - 
속도를 줄이는 생각을 습관하하라는거다(유지보수의 속도, 실제 코드의 속도)

6. 
'모른다'라는 말을 함부로 입에 달고살지 않기
대신에 '찾아보고 따라하면 구현할 수 있다' 라는 마인드셋 가지기 
이해가 안되면, 내일은 이해할 수 있다 라는 생각을 가지고 일단 눈에 익혀두기

이게 기본기다

이모든 자동화들과 리팩토링들이 귀찮은 일이 아니라 자연스럽고 당연한 일이라고 받아들이는게 프로그래머의 기본기임.

가끔씩 현업에서 보면 git commit조차 귀찮아하는 사람들이 있는데, 그런사람들이 대표적으로 기본기가 안되어있는 사람임

항상 이슈를 보면 더 간단하고 간명한 해결책이 있을거라 생각해라

그리고 그 과정은 반복되는 일과 계산을 줄이려는 사고에서 부터 출발하라

그러다 보면 언젠가 너의 머리가 shortest path를 찾는 머신이 되어

코딩이 귀찮은 일이 아니라, 귀찮은 일을 도와주는
행복한작업이 될 것이다






프로그래밍 갤러리에서 퍼온 글인데.. 여기서 의외로 괜찮은 글을 발견한 것 같다.


가끔씩 보면 내가 잘 나아가고 있는지 확인할 수 있을 것 같다.

웹 개발을 배우다보면 Spring or JSP의 환경설정을 할때 web.xml파일을 자주 사용합니다.


web.xml파일에서 서블릿의 url mapping과 같은 간단한 환경 설정부터 복잡한 환경설정까지 모두 가능합니다.


그래서 XML이 무엇이고 어디에서 사용하는지 궁금해졌습니다.


대부분 그저 Spring에 xml파일이 있고,  그 파일을 이용해서 Spring 환경설정을 한다. ! 


이정도로 끝내지만, 좀 더 파고들면 XML은 문서로써 사용할 수 있고 파서로써도 사용할 수 있습니다.


아래 링크의 설명도 조금 부족하지만, 나중에 책을 구입하여 자세하게 알아봐야할 것 같습니다.



http://itstory07.tistory.com/125

사실 모델1, 모델2의 차이점은 Servlet의 사용 유무라고 해도 과언이 아니다. 하지만, 처음 웹개발을 공부하던 당시를 생각해보면


왜 JSP와 Servlet을 같이 사용하며, 각각의 차이는 무엇인가? 라는 물음에 정확한 답을 찾기 어려웠다.


하지만 최근 다시 복습을 하는 과정에서 나의 궁금증을 해결해 줄 수 있는 좋은 사이트를 찾았다.


http://anster.tistory.com/128


이런 소중한 자료를 남기고, 공유해주는 많은 프로그래머 분들에게 감사하다.


나도 제대로 된 개발자가 된다면 내가 알고 있는 많은 지식들을 공유하고 알려주고싶다.


그 날이 올때까지 블로그 운영을 꾸준히 해야겠다.


'점프 투 자바'는 인터넷에 자바의 문법에 대해 잘 설명되어있다. 대학생때 자바책을 들고 공부했지만 책의 두깨에 놀라서 자주 보지 않았던 것 같다.


하지만, 점프 투 자바는 읽기 편하고 핵심만 요약되어 있다. 물론, 객체지향 프로그래밍에 대한 구체적인 내용은 C++공부로 어느정도 틀이 잡혀있었기 때


문에 수월했던 것 같다. 정말 C++책만.. 7회정도 정독한 것 같다. 머리가 안좋아서..


나중에 기회가 된다면 JAVA책을 한권 사서 읽어야겠다.


https://wikidocs.net/book/31

'STUDY > IT' 카테고리의 다른 글

[IT] 정적분석도구들의 차이점  (0) 2019.01.07
[IT] jenkins란? 개념 및 설치방법(2)  (0) 2019.01.04
[IT] jenkins란? 개념 및 설치방법  (0) 2019.01.03
[IT] 프론트엔드 공부사이트  (0) 2019.01.02
[IT]리펙토링이란?  (0) 2018.09.01

데이터베이스의 트랜잭션에 대해 알아보기 전에 자바코드를 예로 들어 "트랜잭션이란 무엇인가??"에 대해 이해하고 넘어가자


트랜잭션 (Transaction)

갑자기 "트랜잭션"이라는것이 나와서 뜬금없다고 생각할 수도 있겠지만 트랜잭션과 예외처리는 매우 밀접한 관련이 있다. 트랜잭션과 예외처리가 서로 어떤 관련이 있는지 알아보도록 하자.

트랜잭션은 하나의 작업 단위를 뜻한다.

쇼핑몰의 "상품발송"이라는 트랜잭션을 가정 해 보자.

"상품발송"이라는 트랜잭션에는 다음과 같은 작업들이 있을 수 있다.

  • 포장
  • 영수증발행
  • 발송

이 3가지 일들 중 하나라도 실패하면 3가지 모두 취소하고 "상품발송"전 상태로 되돌리고 싶을 것이다. (모두 취소하지 않으면 데이터의 정합성이 크게 흔들리게 된다. 이렇게 모두 취소하는 행위를 보통 전문용어로 롤백(Rollback)이라고 말한다.)

프로그램이 다음과 같이 작성되어 있다고 가정 해 보자. (※ 아래는 실제 코드가 아니라 어떻게 동작하는지를 간략하게 표현한 pseudo 코드1이다.)

상품발송() {
    포장();
    영수증발행();
    발송();
}

포장() {
   ...
}

영수증발행() {
   ...
}

발송() {
   ...
}

쇼핑몰 운영자는 포장, 영수증발행, 발송이라는 세가지 중 1가지라도 실패하면 모두 취소하고 싶어한다. 이런경우 어떻게 예외처리를 하는 것이 좋겠는가? ^^

다음과 같이 포장, 영수증발행, 발송 메서드에서는 예외를 throw하고 상품발송 메서드에서 throw된 예외를 처리하여 모두 취소하는 것이 완벽한 트랜잭션 처리 방법이다.

상품발송() {
    try {
        포장();
        영수증발행();
        발송();
    }catch(예외) {
       모두취소();
    }
}

포장() throws 예외 {
   ...
}

영수증발행() throws 예외 {
   ...
}

발송() throws 예외 {
   ...
}

위와 같이 코드를 작성하면 포장, 영수증발행, 발송이라는 세개의 단위작업 중 하나라도 실패할 경우 "예외"가 발생되어 상품발송이 모두 취소 될 것이다.

만약 위 처럼 "상품발송" 메서드가 아닌 포장, 영수증발행, 발송메소드에 각각 예외처리가 되어 있다고 가정 해 보자.

상품발송() {
    포장();
    영수증발행();
    발송();
}

포장(){
    try {
       ...
    }catch(예외) {
       포장취소();
    }
}

영수증발행() {
    try {
       ...
    }catch(예외) {
       영수증발행취소();
    }
}

발송() {
    try {
       ...
    }catch(예외) {
       발송취소();
    }
}

이렇게 각각의 메소드에 예외가 처리되어 있다면 포장은 되었는데 발송은 안되고 포장도 안되었는데 발송이 되고 이런 뒤죽박죽의 상황이 연출될 것이다.

실제 프로젝트에서도 두번째 경우처럼 트랜잭션관리를 잘못하여 고생하는 경우를 많이 보았는데 이것은 일종의 재앙에 가깝다.

이번 챕터에서는 자바의 예외처리에 대해서 알아보았다. 사실 예외처리는 자바에서 좀 난이도가 있는 부분에 속한다.

보통 프로그래머의 실력을 평가 할 때 이 예외처리를 어떻게 하고 있는지를 보면 그 사람의 실력을 어느정도 가늠해 볼 수 있다고들 말한다. 예외처리는 부분만 알아서는 안되고 전체를 관통하여 모두 알아야만 정확히 할 수 있기 때문이다.



정말 데이터베이스의 트랜잭션과는 달라보이지만, 트랜잭션이라는 단어에 아주 적합하게 설명하고있다.

아래 링크로 데이터베이스의 트랜잭션에대해 한번 더 이해하면 완벽하다.


http://mommoo.tistory.com/62

'STUDY > DB' 카테고리의 다른 글

[DB] Oracle SQL 튜닝 및 응용 - 2  (0) 2019.10.29
[DB] Oracle SQL 튜닝 및 응용 - 1  (0) 2019.10.28
[DB] View란?  (0) 2019.01.02
[DB] SQL학습 사이트  (0) 2019.01.02
[DB]SQL 공부하기 좋은 사이트  (0) 2018.10.10

싱글톤 패턴 (singleton pattern)

디자인 패턴중 하나인 싱글톤에 대해서 알아보자. 여러분은 static 에 대한 개념이 생겼기 때문에 싱글톤을 이해하는것이 어렵지 않을 것이다.

싱글톤은 단 하나의 객체만을 생성하게 강제하는 패턴이다. 즉 클래스를 통해 생성할 수 있는 객체는 Only One, 즉 한 개만 되도록 만드는 것이 싱글톤이다.

다음의 예를 보자.

SingletonTest.java

class Singleton {
    private Singleton() {
    }
}

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton = new Singleton();
    }
}

위와 같은 코드를 작성하면 컴파일 에러가 발생한다. 왜냐하면 Singleton 클래스의 생성자에 private 키워드로 외부 클래스에서 Singleton 클래스의 생성자로의 접근을 막았기 때문이다. 이렇게 생성자를 private 으로 만들어 버리면 외부 클래스에서 Singleton 클래스를 new 를 이용하여 생성할 수 없게 된다.

new를 이용하여 무수히 많은 객체를 생성한다면 싱글톤의 정의에 어긋나지 않겠는가? 그래서 일단 new로 객체를 생성할 수 없도록 막은 것이다.

그렇다면 Singletone 클래스의 객체는 어떻게 생성할 수 있을까? 다음처럼 코드를 작성 해 보자.

class Singleton {
    private Singleton() {
    }

    public static Singleton getInstance() {
        return new Singleton();
    }
}

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
    }
}

위와 같이 코드를 변경하면 이제 getInstance라는 static 메소드를 이용하여 Singleton 객체를 돌려 받을 수 있다. 하지만 getInstance를 호출 할 때마다 새로운 객체가 생성되게 된다. 그렇다면 싱글톤이 아니다. 어떻게 해야 할까?

다음처럼 코드를 작성해 보자.

class Singleton {
    private static Singleton one;
    private Singleton() {
    }

    public static Singleton getInstance() {
        if(one==null) {
            one = new Singleton();
        }
        return one;
    }
}

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton1 == singleton2);
    }
}

Singleton 클래스에 one 이라는 static 변수를 두고 getInstance 메소드에서 one 값이 null 인 경우에만 객체를 생성하도록 하여 one 객체가 단 한번만 만들어지도록 했다.

getInstance 메소드의 동작원리를 살펴보자.

최초 getInstance가 호출 되면 one이 null이므로 new에 의해서 객체가 생성이 된다. 이렇게 한번 생성이 되면 one은 static 변수이기 때문에 그 이후로는 null이 아니게 된다. 그런 후에 다시 getInstance 메소드가 호출되면 이제 one은 null이 아니므로 이미 만들어진 싱글톤 객체인 one을 항상 리턴하게 된다.

main 메소드에서 getInstance를 두번 호출하여 각각 얻은 객체가 같은 객체인지 조사 해 보았다. 역시 예상대로 "true"가 출력되어 같은 객체임을 확인 할 수 있다.

싱글톤 패턴은 static에 대한 이해만 있다면 참 알기쉬운 패턴 중 하나이다.


https://wikidocs.net/228

Inner 클래스와 Outer 클래스
– 다른 클래스 내부에 삽입된 클래스
– 외부 클래스를 Outer 클래스 내부 클래스를 Inner 클래스라고 한다.
– Outer 클래스의 인스턴스가 생성된 후에 Inner 클래스의 인스턴스 생성이 가능하다.
– Outer 클래스의 인스턴스를 기반으로 Inner 클래스의 인스턴스가 생성된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Test{
 
public static void main(String[] args) {
Outer o1 = new Outer("o1");
Outer o2 = new Outer("o2");
Outer.Inner oi1 = o1.new Inner(); // 외부 참조방법
Outer.Inner oi2 = o2.new Inner(); // Outer 의 참조변수를 기반으로 Inner의 인스턴스를 생성
// Inner의 인스턴스는 Outer의 인스턴스에 종속적이다.
}
}
 
class Outer{
private String name;
public Outer(String name) {
this.name = name;
}
void print(){
System.out.println(name);
}
class Inner{
Inner(){
print();  // Outer 클래스의 메소드 직접접근 가능
}
}
}


Nested 클래스
– Inner 클래스에 static 키워드가 선언된 클래스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test{
 
public static void main(String[] args) {
Outer o = new Outer();
Outer.Nested on = new Outer.Nested(); // 외부 참조방법
on.print();
}
}
 
class Outer{
 
Outer(){
Nested n = new Nested(); // Outer 클래스에서 객체생성가능
n.print();
}
static class Nested{
public void print(){
System.out.println("nested");
}
}
}


Local 클래스
– 메소드 내에 정의된 클래스
– 메소드 내에서만 참조변수 선언이 가능하다


1
2
3
public interface Printable {
public void print();
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test{
 
public static void main(String[] args) {
Outer o = new Outer();
Printable p = o.create("print");   // 메소드 내에서만 참조변수 선언이 가능하다.
// 따라서 인터페이스 Printable 을 구현하도록 한후 리턴된 인스턴스를 Printable 참조변수로 참조한다.
p.print(); // Printable 의 print 메소드를 호출하면 오버라이딩에 의해서 Local 클래스의 print 메소드가 호출된다.
}
}
 
class Outer{
public Printable create(final String print){ // final 선언된 변수만 Local 클래스내에서 접근이 가능하다.
class Local implements Printable{
@Override
public void print() {
System.out.println(print);
}
}
return new Local();
}
}


Anonymous 클래스
– 클래스의 이름이 정의되지 않은 클래스

– 인터페이스의 인스턴스를 리턴한다.


1
2
3
public interface Printable {
public void print();
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test{
 
public static void main(String[] args) {
Outer o = new Outer();
Printable p = o.create("print");  
p.print();
}
}
 
class Outer{
public Printable create(final String print){
return new Printable() {
@Override
public void print() { // Printable 에 정의된 미완성 메소드의 내부를 바로 채워준다면 인터페이스의 인스턴스 생성을 허용하는 java 문법  
System.out.println(print);
}
};
}
}


http://ccm3.net/archives/4679


http://jsnote.tistory.com/21

1. 접근제어자

- 접근제어자는 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 함

- 접근제어자는 생략가능하며 생략했을 때는 자동으로 default 임을 뜻하게 된다. 따라서 default 일경우에는 접근제어자를 지정하지 않는다.

- 접근제어자가 사용될 수 있는 곳 : 클래스, 멤버변수, 메서드, 생성자

1) private : 같은 클래스 내에서만 접근 가능

2) default : 같은 패키지 내에서만 접근 가능

3) protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능

4) public : 접근 제한이 전혀 없다.


제어자 

같은 클래스

같은 패키지 

자손 클래스 

 전체

 public

 

 

 

 

 protected

 

 

 

 

 default

 

 

 

 

 private

 

 

 

 


- 접근 범위 : private < default < protected < public 순으로 보다 많은 접근을 허용한다



출처: http://88240.tistory.com/448 [shaking blog]

인터페이스추상 클래스
클래스가 아니다클래스다
클래스와 관련이 없다클래스와 관련이 있다
(주로 베이스 클래스로 사용)
한 개의 클래스에 여러 개를 사용할 수 있다한 개의 클래스에 여러 개를 사용할 수 없다.
구현 객체의 같은 동작을 보장하기 위한 목적상속을 받아서 기능을 확장시키는 데 목적

좀 더 정리가 필요한 부분들이 많습니다. 추가적인 업로드 필요


http://loustler.io/languages/oop_interface_and_abstract_class/

+ Recent posts