SMALL

정규표현식(Regular Expression)

정규표현식(Regular Expression)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.

정규 표현식은 이메일, 전화번호 등 사용자가 입력한 값을 검증할 때 사용된다. (유효성 검사)

 

정규 표현식 문법

 

Character 

Character explain
\ 특수 문자가 아닌 문자
. 어떤 문자 1개를 의미
\d digit 숫자
\D digit 숫자 아님
\w [a-zA-Z_]와 동일 ( 모든 알파벳 + _ )
\W [^a-zA-Z_]와 동일
\s space 공백
\S space 공백 아님

 

Quantifiers

Character explain
? 1 or 0
* 0번 이상
+ 1번 이상
{n} n번 반복
{min,} min이상 반복
{min,max} min이상 max이하 반복

 

Boundary-Type

Character explain example
\b 단어 경계(boundary) \btest\b : test tests test 
\B 단어 경계 아님 \Btest\B : test Gtests tests
^ 문장의 시작 ^test : tests aaa test
$ 문장의 끝  

 

Groups and Ranges

Character explain
|  or
( )  그룹
[ ] 문자셋, 괄호안의 어떤 문자든
[^ ] 부정 문자셋

 

연습 

https://regexr.com/

해당 사이트를 이용해 실시간으로 테스트 가능 및 reference 정보 제공 

 

public class TestAA {

    public static void main(String[] args) {
        String result;
        result = "The cat sat on the mat. and the cat".replaceAll("^sat", "*");
        System.out.println(result);
        
        String pattern1 = "[abc][vz]";
        assertTrue("av".matches(pattern1));
        assertFalse("ac".matches(pattern1));

    }
}

Test용 클래스를 작성하여 java application을 실행하며 결괏값 확인 

 

자주 사용되는 정규 표현식

이메일

\w+@\w+\.\w+(\.\w+)?

해당 정규식을 분해해서 보면 

\w+ _를 포함한 알파벳 한개 이상 
@ @
\w+ _를 포함한 알파벳 한개 이상 
\. 정규 표현식에 .이 존재하므로 해당 내용이 아닌 문자.을 나타내기위해서 \.으로 표현
\w+ _를 포함한 알파벳 한개 이상 
(\.\w+)? .co.kr과 같이 .kr이 존재하는 경우를 커버 
?을 이용해 0 or 1개 존재 

 

^.*$ ( 모든 문자 선택) 

^ 문장의 시작
.* 모든 문자 0개 이상 
$ 문장의 끝

 

특수 Case

 

*? or +?

?는 수량자의 역할을 한다고 소개하였다. ( 0 or 1)

하지만 + or *과 같이 사용되면 다른 용도로 사용이 된다. (*? or +? )

lazy로 표현되며 처음에 발견했을 때 쉬고 다시 찾는다.

Hi, Ut, Et, At, Tt.
,.*, 와 같은 정규 표현식을 찾는다고 해보자

결과는 위와 같다.

이 상황에서 *뒤에 ?를 추가한다면 -> *?

결과는 이렇게 달라진다.

 

(?:)

다음으로 Grouping 관련 ? 의 예시이다.

(?:)와 같이 사용되는 경우에는 정규표현식을 통해 찾지만 기억하지는 않음을 나타낸다.

 

위와 같이 ()를 통해 그룹핑한 정보를 가지고 있다.

 

?:를 추가하면 group정보가 나타나지 않는다.

 

java code를 예시로 보면

?: 를 사용하지 않은 경우에는 group으로 지정한 정보를 mather.group(index)를 통해서 조회 가능하다.

?:를 사용하게 되면 group정보가 저장되지 않아 해당 정보를 가져올수없게 된다.

LIST
SMALL
  • SSL 이란
    • SSL 동작 과정
  • HTTPS 프로토콜 사용을 위해서 Keystore, Truststore 만들어보기

SSL(Security Socket Layer) 

Netscape라는 회사에서 서버와 브라우저 간 보안을 위해 만든 프로토콜

 

SSL은 CA(Certificate Authority)(인증기관)라 불리는 서드 파티로부터 

서버와 클라이언트(브라우저)의 인증을 하는 데 사용된다.

 

출처 : http://creator0609.tistory.com/entry/SSL-이란

HTTPS는 HTTP에 데이터 암호화가 추가된 프로토콜

( HyperText Transfer Protocol over Secure Socket Layer )

여기서 사용하는 데이터 암호화가 SSL이다.

 

HTTPS의 동작 과정

그럼 다음으로 SSL 보안 프로토콜을 사용하는 HTTPS의 동작 과정을 살펴보자.

 

출처 : https://preamtree.tistory.com/38

크게 3가지 파트로 구분할 수 있다.

  • 서버
  • 클라이언트(브라우저)
  • 인증기관

 

서버에서는 HTTPS 프로토콜을 지원하기 위해서는 미리 준비해야 하는 과정이 있다.

1. 서버의 공개키, 비밀키 생성

2. 인증기관에게 인증서를 요청 ( 서버의 공개키 정보, 서버의 정보를 인증기관에게 전송 )

  - 인증기관은 서버로부터 받은 정보를 기반으로 인증기관의 개인키로 암호화한 인증서를 서버에게 전송

 

이제 서버는 HTTPS 프로토콜을 지원할 준비가 되었다. 

( 서버의 공개키, 개인키 && 인증기관에 인증서 )

 

다음으로 클라이언트가 서버에 접속을 하는 경우 일어나는 상황을 살펴보자.

 

클라이언트가 SSL로 암호화된 페이지를 요청한다(https)

서버는 공개키를 인증서와 함께 전송한다.

클라이언트는 인증서가 자신이 신용 있다고 판단한 인증기관으로부터 서명된 것인지 확인한다.

검증을 하여 신뢰가 가능하다면

클라이언트는 서버로부터 받은 공개키로 URL, 데이터들과 자신의 대칭키를 암호화 하여 전송

서버는 비밀키로 요청을 복호화하고 전달받은 대칭키로 응답을 암호화해서 전송

 

HTTPS 프로토콜 사용을 위해서 Keystore, Truststore 만들어보기

그럼 이제 SSL, SSL 동작 과정을 알았으니 실제 WebServer에서 https 프로토콜을 사용하기 위한 Keystore, Truststore를 생산하는 과정을 살펴보자. 

java에서 제공하는 keytool 유틸을 이용해보자.

 

keystore ( 비밀키 ) 생성

keytool -genkey -alias sssl -keyalg RSA -validity 7 -keystore ./keystore

 

keystore를 이용해서 CSR(Certificate Signing Reuest) 파일 생성

keytool -export -alias sssl -keystore ./keystore -rfc -file ./sssl.cer

 

CSR(Certificate Signing Reuest) 파일을 이용해서 truststore(공개키) 생성

keytool -import -alias sssl -file ./sssl.cer -keystore ./truststore

 

위의 과정은 인증 기관으로부터 인증서를 받는 과정이 아닌 SSL key를 생성한다. 

인증 기관으로부터 인증서를 받기 위해서는 더 복잡한 과정이 추가된다. 

 

인증 기관으로부터 인증서를 받아 등록하는 과정

-> https://applejara.tistory.com/551

-> https://www.crosscert.com/symantec/board/tomcat5.pdf

 

추가적인 keytool을 이용해 ssl key 생성 방법 https://stackoverflow.com/a/41280603/9923340

 

 

 

LIST
SMALL
  • Entity란
  • Dto란
  • Entity와 Dto를 분리해서 사용해야 하는 이유

JPA에 대해서 학습을 하면서 간단한 Controller을 작성하는 예제를 수행해 보았다. 

간단하게 JPA를 사용하는 로직에서는 굳이 Dto 클래스를 만들지는 않는다. 

JPA 예제 소스에 대한 여러 가지 글들을 찾아서 읽어보는데, Entity와 Dto는 구분해서 사용하는 게 좋다는 글을 보고 해당 내용을 정리해 보도록 하겠다. 

 

먼저 간단하게 Entity, Dto가 무엇인지 알아보자.

Entity

  • JPA에서는 엔티티는 테이블에 대응하는 하나의 클래스 ( 클래스 - 테이블 매핑 관계 )
  • DB에서 영속적으로 저장된 데이터를 자바 객체로 매핑하여 '인스턴스의 형태'로 존재하는 데이터
    ( 객체 - 테이블 로우 매핑 관계 )
  • @Entity, @Column, @Id 등을 이용

Dto 

  • 계층간 데이터 교환이나 View와 데이터를 교환할 때 사용하는 객체
  • DB로부터 데이터를 얻어 Service나  Controller 등으로 보낼 때 사용하는 객체
  • 로직을 갖고 있지 않은 데이터 객체이며, getter/setter 메서드만을 갖는다

위의 두 내용을 간단히 구분하면 Entity는 DB Layer와 데이터 교환을 위한 클래스이고, Dto는 View Layer와 데이터 교환을 위한 클래스이다.


그럼 이 두 가지 클래스를 구분하여서 사용해야하는 이유에 대해서 알아보자. 

  • View와 통신하는 Dto 클래스는 자주 변경이 된다 ( UI 요건에 따라서 )
    하지만, 테이블에 매핑되는 Entity는 그에 비해 변경도 적고, 영향범위도 매우 크다
  • 테이블에 매핑되는 정보가, 실제 View에서 원하는 정보와 다를 수 있다.
    ( 이러한 경우에는 변환하는 로직이 필요한데, 같이 쓰게 되면 해당 로직이 Entity에 들어가게 되어서 Entity가 지저분해진다 )
  • DB로부터 조회된 모든 Entity를 View로 넘기게 되면, 원하지 않는 정보까지 전달하게 되어 정보 노출에 대한 문제가 생길 수 있고, 이를 막기 위한 비즈니스 로직과는 상관없는 방어 로직들이 생기게 된다

 

LIST
SMALL

JDBC 프로그래밍을 하다 보면, 번거롭게 항상 반복되는 코드가 존재한다. 

이러한 반복적인 일들을 Persistence Framework에서 채워주고 개발자들은 자신의 비즈니스 로직에 더욱 집중할 수 있게 된다. 

 

Persistence Framework가 무엇인지 알아보자. 

  • Persistence 
    • 데이터의 지속성 ( 영속성 )
    • 애플리케이션을 종료하고 다시 실행하더라고 이전에 저장한 데이터를 다시 불러올 수 있는 기술
  • Framework
    • 애플리케이션 동작에 필요한 구조를 특성에 맞게 구현해 놓은 것
    • <-> Library : 개발에 필요한 도구들을 모아 놓은 것

각각의 단어에 뜻을 대충 이해하고 전체적인 단어의 뜻을 보면

데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합으로, 
JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며 안정적인 구동을 보장한다.

 

Persistence Framework의 종류로는 대표적으로 2가지가 존재한다.

SQL Mapper

  • SQL 문장으로 직접 데이터베이스 데이터를 다룸
  • 대표적인 예시 Mybatis
  • 개발자가 직접 쿼리를 짜서, 복잡한 쿼리의 경우 성능 튜닝에 좀 더 유리하다

ORM

  • 자바 객체를 통해 간접적으로 데이터베이스 데이터를 다룸 ( SQL을 자동으로 생성해줌 )
  • 대표적인 예시 Hibernate
  • 단순 CRUD의 경우에는 개발자가 직접 반복적인 쿼리를 짜지 않아 간단하고 좋지만, 복잡한 쿼리의 경우 자동 생성된 쿼리를 분석하고 튜닝하는데 번거로울 수 있다

 

 

LIST

+ Recent posts