이번에 Spring Tool Suite로 Maven을 사용할 때, 간혹 추가되지 않은 의존성 몇 가지에 의해, 에러가 나는 경우가 있어서

적어둔다.

 

 

1. web.xml에서 에러 발생 시 추가

1
2
3
4
5
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.2</version>
        </dependency>
cs

2. Java EE Perspective가 없을 때 마켓 플레이스에서 검색하여 설치.

 

3.Maven에 Tomcat API 추가. https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-api

 

1
2
3
4
5
6
7
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
cs

4. 가장 짜증났던 부분인데 JSP 페이지 생성할 때, Servlet 관련 API가 없어서 발생하는 에러 해결.

 

1
2
3
4
5
6
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
cs

 

차후에도 추가 합니다.

'프로그래밍 > Spring Framework' 카테고리의 다른 글

[Spring] @RestController , @Controller의 차이  (0) 2018.08.20

손님이 물건을 사러온다고 가정해보자.


가게 주인은 물건의 가격 (예, 사과)을 확인 하기 위해서 장부를 뒤져서 알려 주어야 한다.


하지만 가게 주인이 가게의 모든 물건의 가격을 외우고 있는 직원을 고용하고 있다면, 이럴 필요가 없어진다.



자료구조적으로 살펴본다면, 사과 이름을 이름순으로 정렬 되어있는 장부에서 탐색해 볼 경우 이진 탐색의 경우 O(log n) 시간이 걸린다.


하지만 우리는 모든 물건의 가격을 외우고 있는 직원과 같이 O(1)시간에 찾아내고 싶다. 이럴때 필요한 것이 바로 해시 함수(Hash function)이


다.



해시함수는 문자열 -> 숫자로  1:1 변환 시켜주는 함수이다.


만일 특정한 길이의 배열이 있다면, 배열 내의 인덱스 하나하나에 다른 문자열의 해쉬 값(가격)이 들어가서 자리할 수 있다.


값이 모두 입력된 상태라면, 이제 문자열만 입력하면 바로 가격을 찾아낼 수 있는것이다. 


해쉬 함수는 배열의 크기를 정확히 알고 있어야만 사용 가능하고, 크기를 벗어나는 값을 반환하는 경우는 없어야 한다.



해시 함수 + 배열 = 해시 테이블


해시 테이블은 해시 맵, 맵, 딕셔너리, 연관 배열로도 불린다.


파이썬에서는 딕셔너리라고 하는 해시 테이블이 있다.




*파이썬 3에서는 print함수 뒤에 출력할 대상을 ()로 감싸주어야 한다...




전화번호부를 직접 만든다고 가정하자.


이름 - 전화번호 로 매핑한다.


사람 이름을 입력시 즉시 전화번호를 알려주어야 한다.




어떤것을 다른것과 연관 시키고자 할때, 무언가를 찾아보고자 할때 해시테이블을 사용하면 좋다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 201804:06:47) [MSC v.1914 32 bit (Intel)] on win32
 
Type "help""copyright""credits" or "license" for more information.
 
>>> phone_book = {}
 
>>> phone_book["jenny"= 1234567
 
>>> phone_book["emergency"= 119
 
>>> print(phone_book["jenny"])
 
1234567
 
>>>
cs


해시 테이블은 웹 사이트를 조회 할때도 사용된다.


예를들어 Google.com을 접속할때는 74.12.239.133으로 자동 번역되어 입력된다. 이런 작업을 DNS resolution작업이라고 한다.




중복 방지



투표소에서 투표를 한다고 가정해보자. 투표소에는 이미 투표한 사람의 목록이 있어야한다. 중복 투표를 방지하지 위해서 리스트에 투표를 할


때마다 그 사람의 이름을 적어 두어야 한다. 하지만, 투표자의 수가 100만명이라면, 리스트를 조회하기에는 시간이 너무 오래걸린다.


파이썬의 해시테이블은 get()이라는 함수로 키에 값이 담겨있는지 확인 할 수 있다.


1
2
3
4
5
6
7
>>> voted = {}
 
>>> value = voted.get("tom")
 
>>> print(value)
 
None
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> voted = {}
>>> def check_voter(name):
...     if voted.get(name):
...             print("쫓아내세요!")
...     else:
...             voted[name] = True
...             print("투표하게 하세요.")
...
>>> check_voter("tom)
  File "<stdin>", line 1
    check_voter("tom)
                    ^
SyntaxError: EOL while scanning string literal
>>> check_voter("tom")
투표하게 하세요.
>>> check_voter("mike")
투표하게 하세요.
>>> check_voter("mike")
쫓아내세요!
>>>
cs



해시 테이블을 캐시로 사용하기



웹 사이트를 접속할때, 로그인 페이지와 같은 것들은 서버가 굳이 고민할 필요없이 모든 사람에게 똑같은 내용만을 출력하는 페이지다.


이런 것들은 저장된 것을 바로 출력해주기만 하면 되는 형태인데, 마치 우리가 지구에서 달까지의 거리를 암기하고 있을때 처럼, 즉시 말해 


줄 수 있게 할 수 있다.


캐싱을 하면 서버에 부담이 줄어들기 때문에 작업 속도를 올릴 수 있다.


1
2
3
4
5
6
7
8
9
10
>>> cache = {}
>>> def get_page(url):
...    if cache.get(url):
...       return cache[url]
...    else:
...       data = get_data_from_server(url)
...       cache[url] = data
...       return data
...
>>>
cs


http://book.naver.com/bookdb/book_detail.nhn?bid=12500834



웹 개발 한다는 사람이 네트워크를 모르면 안된다는 얘기를 들었다.


그래서 네트워크 관련 좋은 책이 뭐냐~ 하고 물어봤더니 이 책을 추천받았다.




'네트워크' 카테고리의 다른 글

HTTP 메시지 (Header,Body)  (0) 2018.09.10
REST,RESTful의 의미  (0) 2018.08.23

http://book.naver.com/bookdb/book_detail.nhn?bid=11586642



컴퓨터 시스템 구조에 대한 개론서이다.


이 역시 기본이라는 얘기를 듣고 바로 구매했다.


첫 장에 전가산기 반가산기가 나오는데, 정보처리기사에서 봤던 내용이라 아주 반가웠다.


언젠가는 다 읽겠지..

http://book.naver.com/bookdb/book_detail.nhn?bid=8142857



컴퓨터를 알려면 운영체제를 공부해야 한다고 해서 가장 유명하다는 공룡책의 번역본을 샀다.


그런데... 너무 두껍다...


천천히 꼭 다 읽어봐야겠다. 도움은 많이 될듯.

관계연산


관계대수 : 절차적 특징, what, how를 모두 명시,


일반 집합연산자 : 합집합, 교집합, 차집합, 카티션 프로덕트


합,교,카티션은 교환법칙이 성립한다. R과 S의 합집합 = S와 R의 합집합


차집합은 순서를 바꾸면 전혀 다른 결과가 나오기 때문에 성립하지 않음


SELECT a, b FROM R, S -> 카티션 프로덕트


R이 3행, S가 5행이면 15행이 출력되기 때문에 조인에 비해서 굉장히 효율이 안좋다.


SELECT R.a, S.b FROM R,S WHERE R.c = S.c; -> 조인


마찬가지의 경우에 5행 이하로 출력되기 때문에 카티션 프로덕트에 비해서 굉장히 효율이 좋다.


순수 관계연산자 : SELECT σ, PROJECT π, JOIN ⋈, DIVISION ÷


SELECT : 조건에 만족하는 행을 추출 -> 필요없는 행을 모두 삭제 -> 특정 컬럼을 검색


선택도(Selectivity)가 낮을때는 시그마를 먼저쓰는것이 효율이 좋다.


SQL에서 WHERE


PROJECT : 조건에 만족하는 열을 추출 -> 필요없는 열을 모두 삭제 -> 특정 튜플을 검색


SQL에서 SELECT


JOIN : 


DIVISION : 


관계해석 : 비절차적 특징, what만 명시,


튜플 관계 해석 : 1튜플 전체를 다 가져와서 필요한 속성을 골라 쓰는 방법


도메인 관계 해석 : 필요한 속성 일부만 변수로 잡아서 골라쓰는 방법



'프로그래밍 > ---DBMS---' 카테고리의 다른 글

정규화란?  (0) 2018.09.29
DB 용어 정리 DDL DML DCL TCL  (30) 2018.05.24


정규화



이상현상(삽입,삭제,정렬시)의 제거


릴레이션 분해


함수종속의 유지


완전함수 종속, 부분함수 종속, 이행함수 종속이 있다.


부분함수 종속을 해결하는것이 2정규화.


이행함수 종속을 해결하는것이 3정규화.


릴레이션의 모든 속성을 후보키로 만드는것을 보이스코드 정규화.


릴레이션에서 다치 종속 관계가 성립하는 경우 4정규화


릴레이션에서 조인 종속이 성립하는 경우 5정규화


릴레이션에서 이상 현상이 발생할 수 있는 함수 종속관계를 제거하기 위하여, 릴레이션을 분해하는 작업.


함수 종속 관계



X -> Y : Y는 X에 완전 함수적 종속 되어있다.


X : 결정자이자 기본키라고 한다.


Y : X의 종속자


한 테이블 내에서 기본키가 A, B(복합키)일때, C는 A, B에 종속 되어있으나, D는 B에만 종속되어 있을때, D를 부분함수 종속이라고 한다.


R(A,B,C,D)는 제2 정규화가 필요하다.


정규화 후에는 R1(A,B,C,) ,R2(B,D)로 나누어진다.


B는 R1의 외래키, R2의 기본키로 작동한다.



한 테이블 내에서 A->B, B->C일때 A->C를 결정할 수 있게 되면 이행함수 종속관계라고 한다.


R(A,B,C)는 제 3정규화가 필요하다.


정규화 후에는 R1(A,B), R2(B,C) 로 나눈다. 이유는, A가 B를 결정하는데 B가 외래키 이므로 A에 의해 C도 결정된다고 논리적으로 이해할 수 


있기 때문이다. R1(A,B) R2(A.C)는 이런 논리적인 연결이 불가능하므로 안된다.



학번->(성명,학과,학년) X->Y 의 예



기본키는 릴레이션의 속성명에 밑줄이 쳐져 있다.


'프로그래밍 > ---DBMS---' 카테고리의 다른 글

관계 데이터 연산  (0) 2018.09.29
DB 용어 정리 DDL DML DCL TCL  (30) 2018.05.24


@Aspect를 이용한 AOP 구현


작업순서


의존설정

@Aspect 어노테이션을 이용한 ASpect 클래스 제작

XML 파일에 <aop:aspectj-autoproxy/> 설정



XML에 <aop:aspectj-autoproxy/>가 @Aspect 어노테이션이 붙어있는 클래스를 찾아서 proxy를 만들어준다.


클래스 내의 @Pointcut 어노테이션이 붙어있는 메소드를 선언한다. 이 어노테이션에는 proxy가 적용될 범위를 지정해준다.


@Around 등의 어노테이션이 붙어있는 메소드가 proxy로 작동할 메소드 인데 @Pointcut의 범위 안에 드는 메소드가 실행될때


해당 어노테이션의 조건에 맞춰서 공통 기능 -> 핵심 기능 -> 공통 기능 순서로 실행된다.




@Before @After 처럼 아예 실행 위치만 지정해주는 어노테이션도 있다.



AspectJ Pointcut 표현식


AspectJ 문법


Execution : 실행할 메소드의 형식 (public void get*(..)) , 범위 (com.kjworks.ex.*.*())를 정한다.


within : 실행할 메소드의 패키지 안에 있는 메소드


bean : 특정 빈에만 실행 (이름의 형식)



'프로그래밍' 카테고리의 다른 글

[AOP] 관점 지향 프로그래밍 (2)  (0) 2018.09.28
[AOP] 관점 지향 프로그래밍 (1)  (30) 2018.09.28
Postman  (0) 2018.09.10

XML 기반의 AOP 구현


1) 의존 설정 (pom.xmll)

2) 공통기능의 클래스 제작 - Advice 역할 클래스

3) XML 설정 파일에 Aspect 설정


XML 파일 설정


<aop:config> : aop 설정 부분


<aop:aspect id, ref> 참조할 aop 설정 클래스의 빈 id,와 aspect의 id


<aop:pointcut id, expression> aop 설정을 적용할 위치와 그곳을 id로 지정


<app:around pointcut-ref, method>aop 설정 메소드(프록시)명과 설정을 적용할 위치 id



공통기능을 먼저 실행하고, 핵심 기능을 부가적으로 실행하여


겹치는 기능을 분리해 관리할 수 있는 부분


<aop:before> 메소드 실행 전에 advice 실행

<aop:after-returning> 정상적으로 메소드 실행 후에 advice 실행

<aop:after-throwing> 메소드 실행중 exception 발생시 advice 실행

<aop:after> 메소드 실행중 exception이 발생하여도 advice 실행

<aop:around> 메소드 실행 전/후 및 exception 발생시 advice 실행





참조



신입SW인력을 위한 실전 자바(Java) 스프링(Spring) 동영상과정 제 09강 AOP-I


'프로그래밍' 카테고리의 다른 글

[AOP] 관점 지향 프로그래밍 (3)  (0) 2018.09.28
[AOP] 관점 지향 프로그래밍 (1)  (30) 2018.09.28
Postman  (0) 2018.09.10



AOP란?


1. 용어 정리


Aspect : 공통 기능


Advice : Aspect의 기능 자체


Jointpoint : Advice를 적용 해야하는 부분. 메소드


Pointcut : Jointpoint중에서 Advice가 적용이 된 부분


Weaving : Advice를 Pointcut 하는 행위



2. 처리 순서


Client -> Proxy -> Target -> Proxy-> Client 의 순으로 처리된다.



3. 구현 방법


Spring에서는 IOC 컨테이너를 구현할때와 마찬가지로 XML 스키마 기반의 AOP 구현, @Aspect 어노테이션 기반의 구현이 가능하다.




'프로그래밍' 카테고리의 다른 글

[AOP] 관점 지향 프로그래밍 (3)  (0) 2018.09.28
[AOP] 관점 지향 프로그래밍 (2)  (0) 2018.09.28
Postman  (0) 2018.09.10

+ Recent posts