데이터베이스2023. 2. 7. 00:52

sum(합을 구하는 함수), decode(치환하는 함수)를 이용해서 그룹별 단순화해보자.

예를 들어, 학과별 자퇴자 명단을 구해보면

select dept, count(sno)

from student

where code = '자퇴'

group by dept;

결과는

 dept count(sno) 
 국문과
 영문과
 철학과

근데 주야간으로 구분해야 한다.

select dept, div_dn, count(sno)

from student

where code = '자퇴'

group by dept, div_dn; 으로 조회하면 아래와 같이 나오는데

 dept div_dn  count(sno) 
 국문과 주간 
 국문과 야간 1
 영문과 주간 
 영문과 야간 
 ... ...  ... 

이런 식으로 같은 과에서 주야별로 나눠져서 나온다. 내가 원한건 아래와 같다.

 

 dept 주간  야간  count(sno) 
 국문과
 영문과

이렇게 하려면 sum과 decode를 활용하면 쉽다.

sum(컬럼명)은 group으로 묶은 데이터 값의 합을 구하는 함수,

decode(컬럼명, 'A',1,0)은 컬럼에 A값이면 1로 치환 아니면 0으로 치환하는 함수

두 개의 함수를 활용하면

select dept, sum(decode(div_dn,'1',1,0) 주간), sum(decode(div_dn,'1',0,1) 야간), count(sno)

from student

where code = '자퇴'

group by dept, div_dn;

위에 표처럼 출력이 되는데

주야간을 구분하는 div_dn 칼럼은 주간이면 1, 야간이면 2로 입력이 되어 있다.

그래서 decode(div_dn,'1',1,0)을 하면 주간일 경우 1로  치환하고,

decode(div_dn,'1',0,1)을 하면 야간일 경우 1로  치환하고 

sum(decode(div_dn,'1',1,0)을 하면 치환한 1값들을 모두 더해져서

주야간별로 깔끔하게 구할 수 있는 것이다.

Posted by 미랭군
Git2023. 1. 31. 15:54

1.  git 파일 생성

git init

 

2. 업로드 할 파일 선택

모든 파일 업로드

git add .

선택 파일 업로드

git add <파일명>/<코드제목>

 

3. 버전 관리 확인. (업그레이드 된 것은 'untracking')

git status

 

4. 주석 설정 (필수)

git commit -m "<주석>"

 

5. 원격 저장소 설정

git remote add origin <GitHub 저장소 주소> 

/** 
	ex: https://github.com/zeroty/hello-spring-boot
**/

6. 업로드

git push origin master

error 발생시

git push origin +master

'Git' 카테고리의 다른 글

[GIT] GIT 명령어  (0) 2021.04.17
git  (0) 2021.04.02
npm proxy 설정 초기화  (0) 2021.04.01
Vue.js 로그인 샘플  (0) 2021.03.09
git 명령어  (0) 2021.03.08
Posted by 미랭군
스프링2023. 1. 28. 18:41

스프링 부트

 스프링 부트 소개 스프링 부트(Spring Boot)는 스프링을 기반으로 실무 환경에 사용 가능한 수준의 독립실행 형 애플리케이션을 복잡한 고민 없이 빠르게 작성할 수 있게 도와주는 여러가지 도구의 모음 이다.

스프링 부트의 핵심 목표

  • 매우 빠르고 광범위한 영역의 스프링 개발 경험을 제공
  • 강한 주장(권고)을 가지고 즉시 적용 가능한 기술 조합을 제공하면서, 필요에 따라 원하는 방 식으로 손쉽게 변형 가능
  • 프로젝트에서 필요로 하는 다양한 비기능적인 기술(내장형 서버, 보안, 메트릭, 상태 체 크, 외부 설정 방식 등) 제공
  • 코드 생성이나 XML 설정을 필요로 하지 않음
설정에 너무 신경 쓰지말고 서비스에 집중해라.

 

 

 

Posted by 미랭군
스프링2023. 1. 16. 16:03

1. Jasypt

Jasypt(Java Simplified Encryption)는 개발자가 암호화 작동 방식에 대한 깊은 지식 없이도 최소한의 노력으로 자신의 프로젝트에 기본 암호화 기능을 추가할 수 있도록 하는 Java 라이브러리이다.

2. 암호화 설정

1) Dependency 추가

  • 설정파일 암호화
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>
 
  • 암호 알고리즘
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.69</version>
</dependency>
 

2) PBEWithMD5AndDES 알고리즘 사용

  • JasyptConfigDES.java
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableEncryptableProperties
public class JasyptConfigDES {

    @Bean("jasyptEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("password"); // 암호화 키
        config.setAlgorithm("PBEWithMD5AndDES"); // 알고리즘
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }
}
 
  • 테스트
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;

public class DESEncyptTest {

    public static void main(String[] args) {
        StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
        pbeEnc.setAlgorithm("PBEWithMD5AndDES");
        pbeEnc.setPassword("password");

        String enc = pbeEnc.encrypt("plain_text");
        System.out.println("enc = " + enc);

        String des = pbeEnc.decrypt(enc);
        System.out.println("des = " + des);
    }
}
 

3) PBEWithSHA256And128BitAES-CBC-BC 알고리즘 사용

SHA256, AES128 사용을 위해 BouncyCastle 라이브러리를 사용한다. BouncyCastle은 PBE(Password Based Encryption)에 보다 많은 알고리즘을 제공해 준다.

  • JasyptConfigAES.java
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableEncryptableProperties
public class JasyptConfigAES {

    @Bean("jasyptEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setProvider(new BouncyCastleProvider());
        encryptor.setPoolSize(2);
        encryptor.setPassword("password"); // 암호화 키
        encryptor.setAlgorithm("PBEWithSHA256And128BitAES-CBC-BC"); // 알고리즘

        return encryptor;
    }
}
 
  • 테스트
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;

public class AESEncyptTest {

    public static void main(String[] args) {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setProvider(new BouncyCastleProvider());
        encryptor.setPoolSize(2);
        encryptor.setPassword("password");
        encryptor.setAlgorithm("PBEWithSHA256And128BitAES-CBC-BC");

        String plainText = "plain_text";
        String encryptedText = encryptor.encrypt(plainText);
        String decryptedText = encryptor.decrypt(encryptedText);
        System.out.println("Enc = " + encryptedText);
        System.out.println("Dec = " + decryptedText);
    }
}
 

3. properties 파일 적용

properties 파일에 암호화 bean 이름과 암호화된 내용을 작성한다.

  • application.properties
jasypt.encryptor.bean=jasyptEncryptor

spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.jdbc-url=ENC(OCVOlP4CAmC/49yWqP4rn/6ZKuleEtEyLJNUh5KjuJEfGzd4iGrFMShHVjoCL6GCeCK9jmArUZO/G7F0jQmsarR6TYMUwag6trEv33e3tcs=)
spring.datasource.username=ENC(MHEf37ImCLMjbioeXLqYCRpgyjUAcZAo88Nq9NbCd4I=)
spring.datasource.password=ENC(BbJAsSr4uISv+mTAw2fN+UTy2dodoDh3++YchPhw5qI=)
 

[출처 및 참고]

Posted by 미랭군
카테고리 없음2022. 11. 23. 18:18

가끔씩 값을 직접 타이핑하지 않고 엑셀이나 다른 프로그램에서 복사, 붙여넣기를 통해서 입력하면 %E2%80%8B가 붙으면서 API조회가 정상적으로 되지 않는 현상이 있다.

이럴 때는 zero width space 문서를 치환시켜주면 해결된다.

Unicode has the following zero-width characters:

U+200B zero width space
U+200C zero width non-joiner Unicode code point
U+200D zero width joiner Unicode code point
U+FEFF zero width no-break space Unicode code point
To remove them from a string in JavaScript, you can use a simple regular expression:

var userInput = 'a\u200Bb\u200Cc\u200Dd\uFEFFe';
console.log(userInput.length); // 9
var result = userInput.replace(/[\u200B-\u200D\uFEFF]/g, '');
console.log(result.length); // 5
Posted by 미랭군
스프링2022. 5. 25. 12:59

authenticated()와 permitAll()는 보안이 필요한 패스를 정의하기 위해 사용된다.

authenticated() 메소드는 애플리케이션에 로그인된 사용자가 요청을 수행할 떄 필요하다. 만약 사용자가 인증되지 않았다면, 스프링 시큐리티 필터는 요청을 잡아내고 사용자를 로그인 페이지로 리다이렉션 해준다.

permitAll() 메소드는 어떠한 보안 요구 없이 요청을 허용해준다.

Posted by 미랭군
웹어플리케이션서버2021. 11. 5. 14:43

^/(정규식1)(정규식2)$

$1: 정규식1

$2: 정규식2 

정규식 순서에 따라 순차적으로 매칭되는 변수 $숫자

# domain.com 으로 접속 시 newdomain.com 으로 리다이렉토

server {

  server_name   domain.com;

  return 301 http://www.newdomain.com$request_uri;

}

# domain.com/change/view.php?no=1000 으로 접속 시 domain.com/changed/article.php?art_no=1000 으로 변환

server {

  server_name   domain.com;

location ~* ^/change/(.*)$ {
     rewrite ^/change/(.*)$ http://domain.com/changed/$1 permanent; 
     break;
}

 

# domain.com/~~~ 으로 접속 시 newdomain.com/~~~ 으로 변환

server {

  server_name   domain.com;

location ~* ^(.*)$ {
     rewrite ^(.*)$ http://www.newdomain.com$1 permanent;
     break;
}

 

# domain.com/aaa.html 혹은 domain.com/bbb.html 으로 접속 시 domain.com/chage.html 으로 변환

server {

  server_name domain.com;

location ~* ^(.*)$ {

     rewrite ^/aaa.html$ /chage.html permanent;
     rewrite ^/bbb.html$ /chage.html permanent;
     break;

}

 

Posted by 미랭군
Vue.js2021. 8. 18. 10:17

가끔씩 VUE객체에 접근해서 보고 싶을 때 아래와 같이 사용하면 된다.

var myVue1 = document.getElementById("myVueId").__vue__;
var myVue2 = document.getElementsByClassName("myVueClass")[0].__vue__;

 

Posted by 미랭군
웹개발2021. 6. 3. 13:45

이클립스에선 디폴트로 체크되어 있어서 기본 기능인 줄 알았는데 STS에선 안되서 찾아보니

이 버튼의 기능이였다니..

Project Explorer > Link with Editor 활성화

Posted by 미랭군
Vue.js2021. 6. 3. 13:42

로컬에서 devserver를 활용하다보면 contextpath가 달라서 서버 CSRF 토큰 체크가 안되서 PUT, POST 메소드가 안되는 현상이 있다. 이럴 땐 onProxyRes를 활용해서 강제로 Path를 치환해주면 된다.

devServer:{
    proxy: {
      "/api": {
        target: "http://localhost:8000",
        pathRewrite: {"^/api" : ""}
      },
      onProxyRes: function(proxyRes, req, res) {
          var cookies = proxyRes.headers['set-cookie'];
          var cookieRegex = /Path=\/XXX\//i;
                     / / Modify the cookie Path
          if (cookies) {
            var newCookie = cookies.map(function(cookie) {
              if (cookieRegex.test(cookie)) {
                return cookie.replace(cookieRegex, 'Path=/');
              }
              return cookie;
            });
                         / / Modify the cookie path
            delete proxyRes.headers['set-cookie'];
            proxyRes.headers['set-cookie'] = newCookie;
          }
        }
    }
}

'Vue.js' 카테고리의 다른 글

CONSOLE에서 VUE객체 접근하기  (0) 2021.08.18
MSA 기본 구조  (0) 2021.03.07
vue.js 개발환경 설정  (0) 2021.03.05
Posted by 미랭군