본문 바로가기

Programming

(29)
[Java] 람다(lambda) 람다(lambda)란? 람다 표현식은 메서드로 전달할 수 있는 익명 함수(anonymous function)을 생성하기 위한 식이다. 매개 변수를 가진 코드 블럭이지만 런타임시에는 익명 구현 객체를 생성한다 // 인터페이스의 익명 구현 객체 Runnable runnable = new Runnable() { public void run() { ... } } // 람다식 Runnable runnable = () -> { ... }; 인터페이스 변수명 = 람다식; 자바는 메소드만 단독으로 생성이 불가능하고 항상 클래스의 구성 멤버로 선언해야 한다. 따라서 람다는 메소드를 선언하는 것이 아닌 메소드를 가진 익명 구현 클래스를 생성하는 것이다. 람다식은 인터페이스 변수에 대입하고 대입될 인터페이스에 따라 작성법이..
[Java] Boxing, Unboxing 자바는 참조형(Refernce Type)이거나 기본형(Primitive Type)이다. 하지만 제네릭 타입은 참조형만 사용이 가능하기 때문에 자바에서는 기본형을 참조형으로 변환하는 기능을 제공해준다. 이러한 기능을 박싱(boxing), 반대를 언박싱(unboxing)이라고 한다. Prmitive Type==== boxing =====>Wrapper Type Integer Integer number = new Integer(100); int sum = 10 + number; // Integer -> int 하지만 이러한 변환 과정은 비용이 소모된다. 또한 박싱된 값은 Heap영역에 저장되기 때문에 보다 많은 메모리를 소모하고 가져올 때에도 메모리 탐색 과정이 필요하다.
[JPA] Entity 생명주기(Entity LifeCycle) 엔티티 생명주기(Entity LifeCycle) 비영속(new/transient) 순수한 객체 상태이며, 영속성 컨텍스트와 관련이 없는 상태 Member member = new Member(); 영속(managed) EntityManager를 통해 엔티티를 영속성 컨텍스트에 저장되어 영속성 컨텍스트가 관리하는 상태 em.persist(member); // 객체 저장 준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된(detached) 상태 em.detach(member); // 특정 엔티티를 분리 em.close(); // 영속성 컨텍스트 닫기 em.clear(); // 영속성 컨텍스트 초기화 추가 설명 삭제(removed) 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한 상태 em.remo..
[JPA] 플러시(flush) 플러시(flush) 플러시는 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것 플러시를 한다고 commit이 이루어지는 것이 아니다! 동작 과정 변경 감지를 동작해 영속성 컨텍스트의 모든 엔티티를 스냅샷과 비교해 수정된 엔티티를 찾음(Dirty Checking) 수정된 엔티티는 쿼리를 만들어 쿼리를 저장 저장된 쿼리를 DB에 전송 플러시하는 방법 직접 호출 em.flush(); 영속성 컨텍스트를 강제로 플러시한다. 플러시를 하더라도 1차 캐시에 있는 내용은 지워지지 않고 저장된 쿼리만 DB에 전송하게 된다 커밋시 자동 호출 JPA가 트랜잭션을 커밋할 때 플러시를 자동으로 호출해 변경 내용을 반영하게 된다 JPQL 쿼리 실행시 자동 호출 Member member = new Member(); em.persi..
[JPA] 영속성 컨텍스트(Persistence Context) EntityManagerFactory & EntityManager EntityManagerFactory 말 그대로의 Entity Manger를 만드는 공장이다 데이터베이스를 하나만 사용한다면 한개의 EntityManagerFactory를 생성한다. 스레드에 안전하기 때문에 서로 다른 스레드간의 공유를 해도 문제가 없고 생성하는데의 비용이 크기 때문에 Application 로딩 시점에 생성해 공유하도록 설계되어 있다. ... EntityManagerFactory emf = Persistence.createEntityManagerFactory("mydatabase"); // EntityManagerFactory 생성 emf.close(); // EntityManagerFactory 종료 EntityManag..
[JPA] JPA란? JPA를 사용하는 이유 자바는 JDBC API를 사용해 SQL을 데이터 베이스에 전달하기 때문에 중요하지만 SQL 중심적인 개발을 하게 되면 많은 문제가 발생한다. JPA Java persistence API는 자바의 ORM 기술의 표준이다 ORM❓ Object-Relational Mapping 객체와 관계형 데이터베이스를 매핑한다는 뜻 ORM 프레임워크는 객체와 테이블을 매핑해 패러다임의 불일치를 개발자 대신 해결해준다. 객체는 객체대로 생성하고, 데이터베이스는 데이터베이스에 맞도록 설계를 가능하게 해준다. 개발자는 이를 매핑하는 방법만 전달해주면 된다. JPA란 자바 ORM에 대한 API 표준 명세이고, 인터페이스의 모음이다. 따라서 구현체가 없고, 사용하기 위해서는 ORM프레임워크를 선택해야한다. 다양한 프레임워크가 존재..
[Spring Security] User Info Request, Response 커스터마이징 - Tistory OAuth2 로그인 구현하기(2) Access Token Request, Response 커스터마이징을 통해 로그인 인증은 완료되었지만, Tistory에서 Access Token만 전달해주기 때문에 지정할 수 있는 유일한 Type인 Bearer로 임시로 지정해 두었다. 하지만 Spring Security에서 제공하는 user-info를 얻어오는 작업을 하게되면 지정했던 Bearer타입을 붙인 채 Access Token을 요청과 함께 전달하기 때문에 이부분도 커스텀이 필요해졌다. 먼저 SecurityConfig에서 설정을 해야한다. @EnableWebSecurity @Configuration @RequiredArgsConstructor public class SecurityConfig extends WebSecurityConfigurerA..
[Spring Security] Access Token Request, Response 커스터마이징 - Tistory OAuth2 로그인 구현하기(1) 작업 환경 spring-boot : 2.4.5 spring-security : 5.4.6 java : 11 Tistory API를 사용해 간단한 애플리케이션을 만드려고 했는데 예상치 못한 어려움에 부딪혔다..... 일반적으로 OAuth2 인증 방식은 Authentication Code를 얻은 다음 POST 요청에 담아 다시 전달하면 Access Token이 응답으로 오는데 Tistory는 이를 GET 요청으로만 허용해 응답이 오지 않았다. 때문에 Token요청을 보내는 Request를 커스텀하는 작업이 필요해졌다. 1️⃣ Access Token Request Customizing Authentication Code 응답을 받은 Spring Security는 이 Code를 담아 다시 Request를 전달하..