프로그래밍 언어

    Redis 와 MongoDB 의 로그인 토큰 적합성 비교

    보통 로그인 토큰 관리는 Redis에서 많이 하는데 현재 프로젝트에서는 MongoDB 를 메인 디비로 사용하고 있어서둘 중 어떤 DB로 로그인 토큰 관리하는게 적합한지 궁금해서 찾아보게 되었다.  데이터 구조 및 저장 형식Redis 는 Key-Value 형태의 데이터 구조를 가지는 인메모리 데이터 저장소이다. MongoDB는 Document 형태의 데이터 구조를 가지며 디스크 기반으로 데이터를 저장한다. 이러한 차이로 Redis 는 메모리 기반으로 빠른 데이터 처리가 가능하고 주로 캐싱에 사용되고 MongoDB는 대용량의 데이터를 저장하고 관리하는데 적합하다.   Redis 사용 시 장점속도: Redis는 메모리 기반 데이터 스토어로, I/O가 메모리에만 집중되어 있어 조회 속도가 매우 빠르다. 이는 로..

    [MongoDB] MongoDB Aggregate()

    db.collection.aggregate()mongodb 조회 시 find 는 간단한 조건에 대해서 사용이 용이한데 다양한 조건을 넣어서 사용할 수는 없다. 따라서 aggregate는 다양한 조건들에 대해 검색하고 싶을때 사용한다. 컬렉션 또는 뷰의 데이터에 대한 집계 값을 계산한다. > 파이프라인에 Explain 옵션이 포함된 경우 쿼리는 집계 연산 처리에 대한 세부 정보를 제공하는 문서를 반환한다. > 파이프라인에 $out 또는 $merge 연산자가 포함된 경우 쿼리는 빈 커서를 반환한다. db.collection.aggregate(pipeline, options) pipeline데이터 aggregate 작업 또는 단계의 시퀀스로입력 문서에 대한 연산을 수행한다. $out 또는 $merge 연산자가..

    [MongoDB] MongoDB compass 설치 (GUI)

    [MongoDB] MongoDB compass 설치 (GUI)

    https://www.mongodb.com/try/download/compass Try MongoDB Tools - Download Free HereFree download for MongoDB tools to do more with your database. MongoDB Shell, Compass, CLI for Cloud, BI Connector and other database tools available.www.mongodb.com  GUI 가 적힌 해당 부분에서 원하는 버전과 환경에 맞는걸로 다운로드하면 된다.   compass 를 사용하는 이유는database, collection, document CURD에 대해 직관적인 UI 조작이 가능하고 쿼리문 날리기도 편하게 되어 있다.

    [Mysql] 데이터 삭제하기 & AUTO INCREMENT 초기화 - DELETE, TRUNCATE, DROP

    mysql 에서 데이터를 삭제하는 방법은 세가지 정도가 있다. DELETE : WHERE 절에 조건을 걸고 데이터 삭제, 테이블 유지TRUNCATE : WHERE절을 사용하지 않고 모든 데이터 삭제DROP : 데이터 삭제 & 테이블 삭제  DELETEDELETE 에서 WHERE 절이 없이 사용하면 모든 데이터가 삭제 되기 때문에 주의한다. name 이 test 인 데이터 행 삭제-- DELETE FROM 테이블명 WHERE 조건;DELETE FROM member WHERE name = 'test';  DROPmember 테이블 자체가 삭제된다.-- DROP TABLE 테이블명DROP TABLE member;   TRUNCATE테이블은 그대로고 데이터만 삭제된다. Auto increment 도 초기화된다...

    [Spring] 프록시 팩토리

    [Spring] 프록시 팩토리

    프록시 팩토리란 프록시 패턴은 인터페이스가 있으면 JDK 동적 프록시를 사용하고 구체 클래스만 있다면 CGLIB를 사용하며 이 설정을 변경할 수도 있다.  스프링에서 이 두개를 사용할 때 InvocationHandelr, MethodInterceptor 를 따로 만들지 않고 Advice를 호출해서 두개다 호출해서 사용한다. 스프링에서 Pointcut 이라는 개념으로  프록시 팩토리를 사용해서 Advice만 호출하면 나머지는 스프링에서 호출해서 사용할 수 있게해 이 문제를 일관성 있게 해결한다.   프록시 팩토리 관련 자주 사용하는 용어 정리포인트컷(pointcut)어디에 부가 기능을 적용할지 판단하는 필터링 로직 주로 클래스와 메서드 이름으로 필터링함어떤 point에 기능을 적용할지 안할지 잘라서(cut..

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

    [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..