본문 바로가기

스프링

(10)
[스프링] CORS(Cross-Origin Resource Sharing) 해결 방법 개요 CORS(Cross-Origin Resource Sharing)란, 웹 브라우저에서 실행되는 스크립트가 다른 출처(Origin)의 서버에 접근하는 것을 제한하는 보안 기능입니다. 웹 서버에서 CORS 설정을 하지 않으면, 다른 출처에서 요청이 들어올 때 브라우저에서 차단됩니다. CORS는 요청하는 출처와 응답하는 출처가 다를 때, 브라우저가 보안상의 이유로 데이터를 차단하는 기능입니다. 이러한 보안상의 이유는 다른 출처에서의 요청이 중요한 데이터를 탈취하거나 악성코드를 심어 보안에 침해할 수 있기 때문입니다. 해결방법 @CrossOrigin 어노테이션 @CrossOrigin 어노테이션은 특정 컨트롤러나 메서드에 대해 CORS를 허용하도록 설정합니다. @RestController public clas..
[스프링 시큐리티] 시큐리티 동작 과정, UserDetails, UserDetailsService. 스프링 시큐리티 동작 과정 (아래는 id, password를 사용하는 form 기반 인증처리 과정입니다. OAuth2.0이나 JWT를 이용한 인증을 할시에는 다른 필터를 거치게 됩니다. ex) OAuth2ClientAuthenticationProcessingFilter) (위 숫자와 아래 숫자는 아무 상관 없음) 사용자가 아이디와 비밀번호(로그인 정보)를 입력하여 form을 전송 AuthenticationFilter에서 UsernamePasswordAuthenticationToken(Authentication 인터페이스의 구현체)을 생성해 AuthenticationManager(실질적으로는 구현체인 ProviderManager)에게 전달(UsernamePasswordAuthenticationToken은 ..
[스프링][자바]Reflection API Reflection API는 자바 언어를 볼때에는 공부해보지 못했던 개념이었다. 그래서 스프링을 공부하면서 DI에대해 공부하다 접하게 된 용어인데 이번기회에 스프링의 동작방식에 대해 조금이라도 이해해 보려고 한다. Reflection API란? 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드,타입,변수들에 접근 할 수 있도록 해주는 자바 API이다. 컴파일 시간이아닌 런타임 시간에 동적으로 특정 클래스의 정보를 가져올 수 있다. 런타임 시점에 동적으로 타입을 분석하고 정보를 가져오므로 JVM 최적화를 할 수 없으므로 성능 오버헤드가 발생할 수 있다. private으로 선언된 필드나 메서드에도 직접 접근이 가능하므로 캡슐화를 무시하게 된다. 즉 애플리케이션 개발목적보단 프레임워크나 라이브러리에서 많..
[스프링] DI, IoC, Bean 제어의 역전 IoC(Inversion of Control) 할리우드 원칙 “Don’t call us, we’ll call you” 우리한테 연락하지 마세요. 우리가 연락할께요. IoC를 설명하기위해 할리우드 원칙을 종종 예시로 들곤 한다. 예를들어 한명의 배우가 영화사에 오디션을 본다고 가정할때 배우 -> 채용을 위한 이력서를 영화사에 제출 영화사 -> 구인을 위해 배우들의 이력서를 수집 및, 채용활동 이력서 -> 배우의 희망 역할, 정보 위와같이 크게 세가지로 분류할 수 있다. 여기서 배우는 이력서를 작성 후 영화사에 제출하고, 영화사는 추가적인 로직을 수행하고, 채용할 배우를 선택하게 될것이다. 여기서 추가적인 로직이란, 배우들의 연기활동 검토, 이력서 검토, 배우에게 추가적인 정보요청 등등을 의미한..
[스프링] 즉시로딩과 지연로딩 프록시의 개념을 미리 알아야 이해 할 수 있다. https://sebang.tistory.com/41 [스프링] 프록시란 em.find(); // 데이터베이스를 통해 실제 엔티티 객체를 조회 em.getReference(); // 데이터베이스 조회를 하지 않은 가짜(프록시) 엔티티 객체를 조회 getReference() 메서드로 호출된 프록시 엔티티 객체는 sebang.tistory.com 지연로딩 FK에 @ManyToOne(fetch = FetchType.LAZY) 어노테이션에 지연로딩을 사용 @Entity public class Member{ @ID @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; @Man..
[스프링] 프록시란 em.find(); // 데이터베이스를 통해 실제 엔티티 객체를 조회 em.getReference(); // 데이터베이스 조회를 하지 않은 가짜(프록시) 엔티티 객체를 조회 getReference() 메서드로 호출된 프록시 엔티티 객체는 껍데기는 똑같지만 내용물은 비어있다. 다만 target에서 실제 클래스를 참조한다. 프록시 특징 target 클래스를 상속 받아서 만들어진다.(Hibernate가 내부적으로 상속시켜줌) 실제 클래스와 겉 모양은 같다. 사용하는 입장에서는 프록시 객체인지, 실제 객체인지 구분하지 않고 사용하면 된다. 프록시 객체가 실제 객체의 참조(target)를 보관한다. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다. Member member = em.getRef..
[스프링] 기본키 관련 매핑 Annotation @Id 직접 Id값을 할당할때 사용 Member member = new Member(); member.setId("ID_A); @GeneratedValue 속성 IDENTITY 사용법 >> @GeneratedValue(strategy = GenerationType.IDENTITY) 데이터베이스에게 값의 생성을 위임하며, 대표적으로 MYSQL의 AUTO_INCREMENT가 있다 IDENTITY는 String 타입의 필드도 가능하지만 SEQUENCE는 문자열 타입 불가능 IDENTITY전략으로 ID값을 생성시 해당 ID값을 알 수 있는 시기는 DB에 저장된 시점이다. 하지만 영속성 컨텍스트에서 관리되기 위해서는 PK값이 필요한데 DB에 저장되기 전에는 ID값이 존재하지 않게된다. 이를 해결하기 위해 보통 T..
[스프링] 필드와 컬럼 매핑 Annotation @Entity @Entity가 붙어있는 클래스는 JPA가 관리하며, JPA를 사용해서 테이블과 매핑할 클래스에 붙게 된다. 기본 생성자가 필수적으로 있어야 한다.(public 또는 protected 생성자) final 클래스, enum, interface, inner 클래스 사용 불가 저장할 필드에 final 사용 불가 속성 name , ex) @Entity(name = "name") JPA에서 사용할 엔티티 이름을 지정하며, 디폴트값으로 해당 클래스의 이름을 그대로 사용한다. @Column 테이블의 column 매핑 속성 name , ex)@Column(name = "name") -> 테이블의 컬럼의 이름을 지정하며, 디폴트값으로는 클래스의 이름이 지정된다. insertable, updatable , ..
[스프링] 영속성 컨텍스트란 개념 엔티티를 영구 저장하는 환경 이라는 뜻이다. 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있다.(EntityManager.persist(entity);) 생명주기 비영속(new/transient) : 영속성 컨텍스트와는 상관없는 새로운 상태. Member member = new Member(); member.setId("member1"); member.setUserName("회원1"); 영속 : 영속성 컨텍스트에 관리되고 있는 상태, DB에는 저장되지 않는다. EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); em.persist(member); // 영속 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태, ..
JPA(Java Persistance API)란 JPA는 Hibernate를 기반으로 만들어진 자바 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. ORM(Object-Relational Mapping) ORM은 설계된 객체와 관계형 데이터베이스간의 매핑을 시켜주는 기술이다. 이를 통해 개발자 대신 패러다임의 불일치를 해결해 준다. ORM은 SQL문이 아닌 Method를 통해 DB를 조작하므로 개발자는 객체 모델을 이용해 비즈니스 로직을 구성하는데에만 집중 할 수 있다 JPA(Java Persistance API) 자바에서는 상속관계란 것이 존재해 부모클래스와 자식클래스간의 관계성립이 가능하지만 데이터 베이스에서는 객체간 상속관계가 존재하지 않는다. 하지만 JPA를 통해 이러한 패러다임의 불일치를 ..