🌠 @Schduling Java 에서 스케쥴링을 구현하는 방법 중 가장 일반적인 방법은 Spring Framework의 @Scheduling 어노테이션을 사용해서 일정한 시간 혹은 간격으로 또는 특정 시간에 코드가 실행되도록 설정이 가능하다 이를 사용하면 간단한 방법으로 메서드를 주기적으로 실행할 수 있는것이다. 🌠 @Scheduling 사용방법 1. ApplicationClass 에 @EnableScheduling 추가 @EnableScheduling @SpringBootApplication public class HomauraApplication { public static void main(String[] args) { SpringApplication.run(HomauraApplication.cla..
해당 수업은 김영한님의 JPA 수업을 통해 작성되었으며 약간의 저의 생각이나 추가적으로 제가 궁금했던 내용을 더 적었다는 사실을 밝힙니다. 💡 플러시(flush) 영속성 컨텍스트의 변경 내용을 DB에 반영하는 작업이다. 플러시 발생한다면 Dirty Checking 변경 감지를 한다 수정된 엔티티 쓰기 지연 SQL 저장소에 등록한다 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다. 영속성 컨텍스트를 플러시하는 방법 em.flush() - 직접 작성을 통해 호출한다 만약 이렇게 작성하게 된다면 System.out.println이 반영되기 이전에 현재 쓰기 지연 SQL 저장소에 있는 내용들이 DB에 반영이 된다. 하지만 쓰기 지연 SQL 저장소에 있는 쿼리문이 사라지진않는다. 트랜잭션 커밋 - com..
해당 수업은 김영한님의 JPA 수업을 통해 작성되었으며 약간의 저의 생각이나 추가적으로 제가 궁금했던 내용을 더 적었다는 사실을 밝힙니다. 💡 영속성 컨텍스트 "엔티티를 영구 저장하는 환경"이라는 뜻으로 JPA를 이해하는데 가장 중요한 용어이다. 우리가 알고있는 persist메소드는 DB에 저장하는 것이 아닌 Entity 영속성 컨텍스트라는 곳에 저장을 하는 것이다. 영속성 컨텍스트는 논리적인 개념으로 눈에 보이지 않는다는 것이다. 또한 EntityManager로 영속성 컨텍스트에 접촉하는 것이다. 엔티티의 생명 주기 비영속(new / transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 객체를 생성한 경우 Member member = new Member(); member.setId("me..
해당 수업은 김영한님의 JPA 수업을 통해 작성되었으며 약간의 저의 생각이나 추가적으로 제가 궁금했던 내용을 더 적었다는 사실을 밝힙니다. 💡 JPA의 구동 방식 이번 수업은 Spring을 사용하지 않는 과정입니다. 때문에 boot로 편하게 진행할 수 있는 부분을 굳이 작성하는 것을 이해해주세요 Persistence.xml DB 설정 정보를 작성한다 EntityManagerFactory 애플리케이션에서 단 한번만 생성하고 전체에서 공유한다 이때 Unit-name을 꼭 맞춰주어야 한다. EntityManager DB 커넥션 풀과 같은 기능을 지니고 있는 것이다. DB와 밀접한 관계가 있기때문에 Thread 간 공유가 안되고 사용이 끝나면 꼭 close()를 해주어야 한다 ★ JPA의 모든 데이터 변경은 트..
💡 JPA란? Java Persistence API의 줄임말이다. 또한 JPA는 자바 진영의 ORM 기술 표준이다. https://latewalk.tistory.com/160 💾 ORM이란? ORM(Object relational mapping) 이란? 객체와 관계형 데이터 베이스의 데이터를 자동으로 매핑해주는 것을 말한다. 객체 지향 프로그래밍은 클래스를 사용하고 관계형 데이터베이스는 테이블을 사용한 latewalk.tistory.com 💡 우리는 왜 JPA를 사용해야 할까? 1. ORM으로 인한 SQL 중심적인 개발에서 객체 중심의 개발로 변경 2. 생상성이 좋아진다 SQL로는 길게 작성해야 하는 로직이 매우 간단해진다. 저장 : jpa.persist(member) 조회 : Member member ..
기존의 JWT Filter 는 그저 리스트의 형태로써 URL만 사용할수 있고 와일드카드또한 사용할수 없었다. 이는 생각보다 매우 불편하다. 이는 프로젝트가 커지면 커질수록 불편해지고 심지어 와일드카드를 사용할 수 없게 되어 이렇게 징그러운 코드가 발생하게 되는것이다. 하지만 이는 해결책이 있었다. 물론 와일드까지 사용할수 있는 것이다. OncePerRequestFilter의 shouldNotFilter 이 필터는 OncePerRequestFilter 내부에 존재하는 메서드이다. 이 메소드의 주 용도는 내가 원하는 URL을 그냥 통과하게 만드는 것인데 정확한 공식문서는 Can be overridden in subclasses for custom filtering control, returning true ..
프로젝트를 진행하다보면 Service는 Interface 로 만들고 구현은 ServiceImpl에 하는 것을 본적이 있을것이다. 왜 굳이 바로 구현을 하지 않고 다른곳에 구현을 하는 것일까? 결론부터 말하자면 이는 객체지향의 설계 5 원칙중 하나인 OCP를 실현하기 위해서이다 ▶ 그럼 OCP 란 무엇일까? 간단하게 말해보자면 개방-폐쇄 원칙으로써 확장에 대해 열려있고 수정에는 닫혀 있어야한다는 뜻으로 개발 작업을 하다보면 수많은 모듈이 생성된다. 근데 그 하나의 모듈이 완벽할수 있을까? 혹여 완벽하다 하더라도 수정을 피하기는 어렵다하지만 수정을 하다보면 연관되어 있는 모든 모듈을 줄줄이 고쳐야 한다면 그것이 좋은 개발이라고 할 수 있을까? 이에 개발 - 폐쇄 원칙에 따라 시스템의 구조를 올바르게 리펙토링..
두개를 비교하기 이전에 무엇인지 부터 알아보자 Entity Entity는 실제 DataBase의 테이블과 1 : 1로 매핑되는 클래스로써, DB의 테이블 내에 존재하는 컬럼만을 속성으로 가지고 있다. Entity 클래스는 상속을 받거나 구현체여서는 안되며, 테이블 내에 존재하지 않는 컬럼을 가져서도 안된다 DTO DTO(Data Transfer Object)는 데이터 전송 객체라는 의미를 가지고 있다. 즉, 각 계층간 데이터 교환을 위한 객체이다 ▶ 분리한 이유 1. Entity의 보호 이게 굉장히 큰 이유중 하나라고 볼 수 있다. entity를 사용자에게 노출하게되면 원하지 않는 상황에서 자원의 속성이 변경될 가능성이 있다. 그리고 엔티티를 UI 계층에 노출하는 것은 테이블 설계를 화면에 공개하는 것이..
NoArgsConstructor 설명은 간단하다 파라미터가 없는 생성자를 만드는것으로 객체를 생성할 때에도 인자를 넣어주지 않아도 된다. ※ 하지만 필드에 final 의 객체가 있는경우 에러가 발생한다. AllArgsConstructor 이것또한 설명은 간단하다 파라미터로 모든 인자를 받는것이다. 객체를 생성할때 변수의 순서대로 값을 입력해주면 된다. RequiredArgsConstructor 위에서 말했던 NoArgsConstructor의 단점 final 값의 에러에 대응하는것으로 final 한 값을 인자로 넣어줄수 있다. ※ 단 final 이 아닌 다른 값은 넣을수 없다. Reference https://devmoony.tistory.com/194 [Spring] Lombok 생성자 @NoArgsCo..
1. @Controller Spring MVC 의 대표 어노테이션 Controller 는 View 를 반환하기 위해 사용하는 어노테이션이다 순서 Clinet 는 URI 형식으로 웹 서비스에 요청을 보낸다 DispatcherServlet이 요청을 처리할 대상을 찾는다(존재의 유무) HandlerAdapter를 통해 요청을 위임하게 되고 그 요청은 Controller 로 가게 되는것이다. Controller 는 요청을 처리한 후에 ViewName 을 반환하게 된다 DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다 View 네임을 통해 결과적으로 ViewResolver 에서 이름을 통해 렌더링 되면서 사용자에게 화면을 보여주게 된다...