분류 전체보기
UserDetails 스프링 시큐리티가 사용자 정보를 알 수 있도록 사용자에 대한 정보를 저장하는 인터페이스이다. 즉 스프링 시큐리티가 개발자 대신에 내부적으로 사용자 정보를 알 수 있도록 UserDetails 인터페이스를 상속받아서 스프링 시큐리티가 필요한 정보들을 구현해야한다. 다음과 같이 User 클래스에 UserDetails를 상속받아서 시큐리티가 필요한 정보를 구현할 수 있다. 이렇게 설정을 하면 스프링 시큐리티는 사용자를 시큐리티 정보에 구성하기 위한 최소한의 정보를 내부적으로 저장하게 된다. @Entity @Getter public class User implements UserDetails { @Id @GeneratedValue private Long id; private String us..
우리는 JPA를 사용해서 엔티티를 설계할 때, 보통 연관관계를 맺어서 설계하는 경우가 대다수이다. 연관관계는 보통 1:N, N:1의 연관관계가 가장 많이 쓰일 것이다. 팀 엔티티와 회원 엔티티가 일대다 관계로 존재한다고 가정해보자. A팀을 데이터베이스에서 가져와 영속화 상태로 만들고, A팀 객체에 회원들을 추가시키려면 회원 객체도 영속화 상태로 만들어서 추가해야 정상적으로 데이터베이스 테이블에 반영될 것이다. 그런데 추가해야할 회원이 100명 또는 엄청 많은 회원이라면 모두 영속화 시켜야 할 것이다. 이 때, 영속성 전이 속성을 이용하면 이런 문제를 모두 해결해준다. 영속성 전이 - CASCADE 영속성 전이를 사용하는 목적은 다음과 같다. 특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티도 함께 영속..
RDBMS와 NOSQL DBMS와 SQL DBMS(DataBase Management System) 사용자가 데이터베이스 내 데이터에 접근하도록 도와주는 시스템이다. SQL(Structured Query Language) 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다. 자료의 검색과 관리, DB 스키마의 생성과 수정, 데이터베이스 객체 조정 관리를 위해 고안되었다. RDBMS(Relational DataBase Management System) 관계형 데이터베이스 관리 시스템 RDB(Relational DataBase)를 관리하는 시스템이며, RDB는 관계형 데이터를 기초로 두고 모든 데이터를 2차원 테이블 형태로 표현하는 데이터베이스이다. 각각의 속성과..
프록시(Proxy) A 엔티티와 B 엔티티가 N:1의 연관관계를 가지고 있다고 가정해보자. 우리가 A 엔티티를 조회할 때 항상 B 엔티티가 필요하지 않을 수도 있다. 예를 들어 회원 엔티티를 조회할 때 연관된 팀 엔티티는 비즈니스 로직에 따라서 사용될 때도 있지만, 그렇지 않을 때도 있다. 예를들면 우리가 이미 팀을 알고있는 회원은 회원 정보만 궁금할 것이고, 아무 정보도 모르는 회원은 회원 정보와 팀 정보 모두 궁금할 것이다. 즉, 하고싶은 말은 회원 정보만 궁금할 때는 회원 엔티티만 사용하므로 연관된 팀 엔티티를 불러올 필요가 없다는 것이다. JPA는 이런 문제를 해결하려고 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데 이것을 지연 로딩이라고 한다. 쉽게 이야기해서 tea..
영속성 컨텍스트는 내부에 캐시를 가지고 있는데, 이것을 1차 캐시라고 한다. 엔티티가 영속상태가 되면 모두 1차 캐시에 저장이 된다. 1차 캐시의 형태는 @Id로 매핑된 엔티티의 식별자와 이에 해당하는 엔티티 객체, 스냅샷이 들어있다. 우선적으로 스냅샷을 제외하고 1차 캐시가 하는 역할을 알아보자. 엔티티 등록 밑의 소스코드는 엔티티 객체를 생성하고 초기화한 다음, 엔티티 매니저를 통해서 엔티티 인스턴스를 영속화하는 코드이다. //엔티티 인스턴스를 생성(비영속) Member memberA = new Member(); member.setId("memberA"); member.setUsername("회원A"); //엔티티 인스턴스를 영속화(영속) em.persist(memberA); 그렇다면 위 코드를 실행..
CORS(Cross Origin Resource Sharing) Origin 프로토콜 + 호스트 + 포트번호 Cross Origin과 Same Origin Same Origin : 프로토콜, 호스트, 포트번호가 동일한 URI Cross Origin : Same Origin이 아닌 URI Q. 다음중https://helloworld.com 과 동일 출처(Same Origin)이 아닌것은? https://helloworld.com:8080 http://helloworld.com https://helloworld.com/members 동일 출처(Same Origin)이 되려면 프로토콜, 호스트, 포트번호가 동일해야 하므로 정답은 3번이다. 나머지 1,2번은 Cross Origin이라고 할 수 있다. CORS ..
전체 종류 다대일: @ManyToOne 일대다: @OneToMany 일대일: @OneToOne 다대다: @ManyToMany 다대일(N:1) 단방향 가장 많이 사용하는 연관관계이다. 반대는 일대다(1:N) 이다. 객체 입장에서 한쪽에서만 참조가 가능하다. @Entity class Member { ... @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; } @Entity class Team {...} 다대일(N:1) 양방향 외래 키가 있는쪽이 연관관계의 주인이다. 객체 입장에서도 양쪽에서 참조가 가능하다. //연관관계의 주인 @Entity class Member { ... @ManyToOne @JoinColumn(name = "TEAM_ID") pr..
커넥션 풀이란? 데이터베이스에 접근을 어떻게 하든, 어떤 데이터베이스에 접근을 하든간에 해당 데이터베이스에 대해서 커넥션을 획득해야 한다는 것을 알고 있을 것이다. 커넥션이란 말 그대로 특정 데이터베이스에 접근하기 위한 권한을 획득하는 것이다. 우리는 데이터베이스 커넥션을 획득하려면 특정 데이터베이스에 대한 아이디, 패스워드 등의 값을 입력해서 넘겨야 하고, 또한 네트워크를 사용하는 등 많은 자원과 비용을 소모하게 된다. 만약에 몇백만의 사용자가 이용하는 웹 사이트가 존재한다고 가정해보자. 웹 사이트에 대한 각각의 리소스에 접근하려면 데이터베이스에 접근을 해서 특정 데이터를 불러와야 할 것이다. 하지만 이런 상황이 발생할 때마다 데이터베이스에 대한 커넥션을 획득하는 로직을 계속해서 실행하게 된다면, 수 ..
쿠키와 세션이라는 말을 컴퓨터 관련 전공자가 아니어도 많이 들어봤을 것이다. 이 쿠키와 세션은 무엇이고 왜 쓰는 것일까? 우리는 웹 브라우저를 사용하면 HTTP 프로토콜을 사용하여 웹 서버와 통신하는 것을 안다. 그런데 HTTP는 다음과 같은 특성이 있다. HTTP의 Stateless HTTP는 무상태(Stateless) 프로토콜이다. 즉, HTTP는 상태를 유지하지 않는다는 것이다. 쉽게 말하면 클라이언트(웹 브라우저)와 서버는 요청과 응답을 주고받으면 연결이 끊어지고, 이 요청이 끊어지면 더 이상 전의 요청을 기억하지 못한다는 것이다. HTTP는 이런 특성이 있는데, 어떻게 우리는 웹 브라우저의 어떤 사이트에 로그인을 하면 장기간 지속될 수 있는 것일까? 분명히 컴퓨터를 껏다가 키면 로그인을 다시해야..



