프로그래밍 언어

    [Java] 동적 프록시 (JDK 동적 프록시, CGLIB)<img src=">

    [Java] 동적 프록시 (JDK 동적 프록시, CGLIB)

    JDK 동적 프록시 인터페이스 기반으로 프록시를 동적으로 만들어 사용하기 때문에 인터페이스가 필수이다. 자바에서는 리플렉션을 사용해 proxy 클래스를 제공해주고 있다.  리플렉션(Refliction)이란 구체적인 클래스 타입을 알지 못해도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API 이다. 사용 시기는 동적으로 클래스를 사용해야할 때 사용하는데 작성 시점에는 어떤 클래스를 사용할지 모르지만 런타임 시점에 가져와 실행해야하는 경우에 필요하다. 단점은 메서드에 값이 잘못 입력 되어도 컴파일 오류가 발생하지 않고 해당 코드를 직접 실행하는 시점에 런타임 오류가 발생해서 그때 오류를 알 수 있다. 이러한 이유로 리플렉션을 잘 사용하지 않고, 만약 사용하게 된다면 공통 처리가 필요..

    [Java] 프록시 패턴, 데코레이터 패턴

    [Java] 프록시 패턴, 데코레이터 패턴

    프록시란 프록시의 뜻은 대리자, 대변인으로 누군가 일일 대신 시키는 것을 의미하는데 프로그램에서 사용 되는 뜻도 클라이언트가 객체를 직접 사용하는 것이 아니라 중간에 프록시를 거쳐 사용하는 것이다. 프록시 패턴이란 객체를 대리자가 대신 처리함으로 써 로직의 흐름을 제어하는 패턴이다. 어떤 객체를 사용하고자 할때, 객체를 직접적으로 참조하는 것이 아닌 해당 객체를 대항하는 객체를 통해 대상 객체에 접근하는 방식을 사용하면 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고, 실제 객체의 기능이 필요한 시점까지 객체의 생성을 미룰 수 있다. 서버와 프록시의 같은 인터페이스 사용 클라이언트는 서버 인터페이스에만 의존한다. 서버와 프록시가 같은 인터페이스를 사용해서 DI를 사용해서 ..

    [Java] 템플릿 메서드 패턴, 전략 패턴, 템플릿 콜백 패턴

    [Java] 템플릿 메서드 패턴, 전략 패턴, 템플릿 콜백 패턴

    템플릿 메서드 패턴 템플릿 메서드 패턴이란, 여러 클래스에서 공통으로 사용하는 메서드를 템플릿화하여 상위클래스에서 정의하고 하위 클래스마다 세부 동작을 다르게 구현하는 패턴이다. 템플릿 메소드 패턴은 상속이라는 기술을 극대화하여, 알고리즘의 뼈대를 맞추는 것에 초점을 둔다. 변하지 않는 템플릿(기능)은 상위 클래스에만 만들어두고 자주 변경되며 확장할 템플릿(기능)은 하위 클래스에서만 만든다. 이렇게 하 면 자식 클래스가 알고리즘의 전체 구조를 변경하지 않고, 특정 부분만 재정의할 수 있는데 하위 클래스를 사용해 상속과 오버라이딩을 통 한 다형성으로 문제를 해결하는 것이다. 템플릿 메서드 패턴은 클래스를 계속 만들어야 하는 단점이 있는데 익명 내무 클래스를 사용하면 이러한 단점을 보완할 수 있다. 익명 내..

    [Java] 스레드 로컬 - Thread Local

    스레드 로컬이란 여러개의 스레드가 존재할 때, 해당 스레드만 접근할 수 있는 특별한 저장소를 말한다. 스레드 로컬 클래스는 한 스레드에 의해 읽고 쓰여지는 변수를 생성한다. 각 스레드마다 별도의 내부 저장소가 제공된다. 스레드 로컬을 사용하는 이유 , 동시성 문제 서로 다른 두 스레드가 하나의 변수에 접근해 동시에 값을 변경한다면 이 변수는 공유 자원으로 동시성 문제가 발생할 수 있다. 동시성 문제는 트래픽이 적은 상황에서는 괜찮은데 트래픽이 많아질수록 자주 발생한다. 또한 스프링 빈처럼 싱글톤 객체의 필드를 변경하며 사용할 때도 동시성 문제에 대해 조심해야 한다. 이러한 문제를 해결하기 위해 스레드 로컬을 사용한다. 스레드 로컬 사용 시 주의사항 스레드 로컬을 모두 사용하고나면 remove 메서드를 호..

    [Mysql] Docker 환경에서 mysql 설치 후 접속 에러 - Access denied for user 'root'@'172.17.0.1' (using password: YES)

    Docker 환경에 mysql 을 설치하고 localhost로 접속하면 Access denied for user 'root'@'172.17.0.1' (using password: YES) 다음과 같은 에러가 나면서 접속이 안된다. docker 에서 컨테이너 접속 $ docker exec -it bash mysql 접속 > mysql -u root -p 계정에 권한 부여 > GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.0.1' WITH GRANT OPTION; 다른 계정을 사용한다면 계정 생성 및 권한 부여 > CREATE USER 'admin'@'172.17.0.1' IDENTIFIED BY '비밀번호 입력'; > GRANT ALL PRIVILEGES ON *.* T..

    [javascript] 이전 페이지 URL 확인하기 console.log(document.referrer)

    [javascript] 이전 페이지 URL 확인하기 console.log(document.referrer)

    이메일에 링크를 보낼 때 이전 페이지가 내가 원하는 페이지에 접속해 있던 사람만 해당 url 로 접속할 수 있고 다른 사람한테 공유가 되면 url 정보가 동일하지 않기 때문에 접속하지 못하게 하고 싶었다. 즉 특정 url 만 타고 넘어온 경우에만 내가 제공하는 url 에 접속할 수 있게 하고 싶었다. 개발자 도구에서 콘솔창에 해당 내용을 찍으면 이전 URI 정보를 반환하는데 console.log(document.referrer) 처음 화면에 들어가서 해당 콘솔을 찍으면 아무런 값이 안나오는 것을 볼 수 있다. 네이버에서 검색하고 페이지 이동 후 검색해보면 이전 페이지였던 네이버 주소를 확인할 수 있다. 현재 페이지에서 url 을 새로 입력하고 다른 페이지로 이동 후 콘솔을 찍으면 그것도 아무런 값이 안나..

    [MySQL/Intellij] Public key retrieval is not allowed 에러 해결

    [MySQL/Intellij] Public key retrieval is not allowed 에러 해결

    에러 원인 Mysql DB 에 접속시도를 했는데 Public key retrieval is not allowed 에러가 나면서 DB에 접속이 안되었다. Mysql 8.0 버전 부터 보안적인 이슈로 useSSL 옵션에 대한 추가적인 설정이 필요해졌다. useSSL=false 로 설정되어 있는지, allowPublicKeyRetrieval 설정이 되어 있는지 확인해본다. 해결 만약 다음과 같은 에러가 난다면 두가지 옵션에 대해서 추가 및 변경해준다. 접속하는 datasource URL에 아래와 같이 설정해준다. jdbc:mysql://localhost:port/database?useSSL=false&allowPublicKeyRetrieval=true useSSL : DB에 SSL로 연결 allowPublic..

    [SQL] MySQL 5.7버전과 8.0버전 차이점, 8.0 업그레이드

    5.7버전 8.0버전 차이점 1. 사용자 인증 방식 변경 8.0버전 부터는 별도의옵션없이 Caching SHA-2 Authentication 인증 방식 사용 8.0버전에서 Native Authentication 인증 방식을 사용하려면 --dafault-authentication-plugin=mysql_native_password 파라미터를 활성화 한다. Native Authentication MySQL 서버에 기본적으로 내장되어 있는 인증 방식으로 사용자의 계정 정보와 암호를 MySQL 내부 데이터 딕셔너리에 저장한다. 사용자 계정과 암호가 MySQL 의 'mysql.user' 테이블에 저장된다. 암호는 해시 형태로 저장되며, 암호를 비교할 때 클라이언트에서 전달된 암호를 해시하여 저장된 암호화 비교한다..

    [SQL] IN, EXISTS 비교 및 속도 비교

    [SQL] IN, EXISTS 비교 및 속도 비교

    IN in은 입력된 값들 중 하나라도 일치하는 것이 있으면 조회된다. 쿼리가 실행될 때 내부적으로 or 연산자로 변경되어 실행되는 것이다. select e.emp_no from employees.employees e where emp_no in (SELECT s.emp_no from employees.salaries s); select e.* from employees.employees e where emp_no in (SELECT s.emp_no from employees.salaries s) employees 데이터는 300,024개 salaries 데이터는 2,844,047개이다 시간 초가 계속 변하긴 하지만 select 값 하나를 조회할 때는 3-5ms select 값을 전체 조회할 때는 4-5m..

    [DB] MySQL 샘플 데이터

    [DB] MySQL 샘플 데이터

    MySQL 을 공부하다보면 데이터 샘플이 필요할 때가 있는데 MySQL 홈페이지에서 제공하는 데이터가 있다. https://dev.mysql.com/doc/index-other.html 데이터 다운로드 Employee 데이터를 GitHub에서 다운받을 수 있다. $> unzip test_db-master.zip $> cd test_db-master/ 압축을 풀고 엔진 세팅을 해준다. set storage_engine = InnoDB; -- set storage_engine = MyISAM; -- set storage_engine = Falcon; -- set storage_engine = PBXT; -- set storage_engine = Maria; git clone 으로도 사용이 가능하다. Inte..