CORS 문제Access to XMLHttpRequest at 'http://localhost:8080/example' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 리액트에서 API 서버로 요청을 보냈더니 위와 같은 메세지를 받았다.보안상 서로 다른 도메인이 서버 자원에 접근하려 하는 경우 이를 막는 것이다. CORS 설정을 통해 이 문제를 해결할 수 있다. @Configurationclass WebConfig { @Bean fun corsConfigurer(): WebMvcCo..
문제 상황JPA의 saveAll()을 이용하여 600건의 데이터를 저장하는 기능을 만들었다. 실제 결과는 300건만 저장되고 있었다. 원인JDBC 기본 배치 크기는 따로 설정하지 않은 경우 한번에 처리될 수 있는 개수가 제한되어 있음 해결방법1 - 배치 크기 설정application.properties에 설정을 통해 배치 크기를 조정할 수 있다.단, 키 생성 전략으로 IDENTITY 방식을 사용하면 사용할 수 없다. 영속성 컨텍스트 내부에서 엔티티 식별을 위해 PK값을 사용하는데 IDENTITY 방식은 DB에 INSERT한 후에 PK 확인이 가능하기 때문이다.spring.jpa.properties.hibernate.jdbc.batch_size=2000spring.jpa.properties.hibernat..
Spring Boot 3.2.3.RELEASE가 아니라 Spring Framework 3.2.3.RELEASE로 개발된 프로젝트에서 개발 및 유지보수를 하면서 아래와 같은 코드를 반복적으로 보았다.TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition());try{ //do something transactionManager.commit(status);} catch (Exception e) { transactionManager.rollback(status);} 주로 @Transactional로 사용하는 기능을 코드로 사용하고 있었다. 스프링 프레임워크의 특징 중 하나인..

패키지 사이에 의존성을 낮추는 방법 절차지향 로직 사용할 패키지에 인터페이스를 만들고 구현은 도메인에 해당하는 패키지에서 구현 도메인 이벤트 퍼블리싱 도메인 이벤트 퍼블리싱이란? 패키지 사이에 결합도를 낮추기 위해 사용 도메인이 이벤트를 생성하면 이벤트 디스패처가 리스너에게 전달 어떤 동작 이후에 연관된 동작을 요청할 때 사용 ex) 식사를 마친 테이블에 계산이 끝나면 테이블 상태를 변경한다. 구현 방법 Spring Framework에서 제공하는 기능으로 구현하는 방법 Spring Data JPA에서 제공하는 기능으로 구현하는 방법 Spring Data JPA의 이벤트 구현 예제 & 전체 소스 Publisher // 이벤트로 전달할 형식 public class SpringEventPublisher { p..

JPA의 장점 객체에 적절한 책임을 할당하는 객체지향적 개발이 가능하다. 새로운 필드가 추가될 때마다 쿼리를 수정해야 하는 문제가 발생하지 않는다. 생성 방식 create: 기존 테이블 삭제 후 다시 생성 (개발) create-drop: create와 같으나 종료 시점에 테이블 drop (개발) update: 변경된 부분만 반영 (테스트, 개발) validate: entity와 table이 정상 매핑되었는지만 확인 (테스트, 운영) none: 사용하지 않음 (스테이징, 운영) 데이터베이스 스키마 생성 방식 설정 // application.properties spring.jpa.hibernate.ddl-auto={생성_방식} 스키마 자동 생성을 위한 Entity class 작성법 @Entity // (1)..
OAuth 사용자의 정보를 가지고 있는 제3의 서비스로부터 접근 권한을 위임 받아서 웹 사이트의 자원에 접근하는 방식 사용자의 정보를 저장하고 관리해야 하는 부담을 줄일 수 있다. 사용자도 자신의 개인정보를 신뢰할 수 없는 타인에게 제공하는 단점을 해결한다. OAuth 제공자는 네이버, 카카오, 구글 등이 있다. JWT Header, Payload, Signature로 구성된 암호화된 토큰 session 기반 인증 방식과 달리 stateless한 구현이 가능하다. 로그인 흐름 Resource Owner(사용자)가 Client(서버) 자원에 접근하려 하면 Resource Server(OAuth 제공자)의 로그인 창을 호출하여 인증을 요구한다. 로그인을 성공하면 Resource Server에 로그인 API..

i18n internationalization의 축약형 총 20자리 글자 중에 맨 앞 i와 맨 뒤 n을 제외한 나머지가 18글자가 있다고 해서 i18n 이다. MessageSource란? 국제화(i18n)를 지원하는 스프링 인터페이스 하나의 메세지에 대해서 다국어로 표시해주는 기능 제공 Entity 생성 @Entity @Getter @Setter public class Languages { @Id @GeneratedValue private Integer id; private String locale; private String messageKey; private String messageContent; } sample data 생성 쿼리 작성 src/main/resources 경로에 data.sql 파일..

프록시란? 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데 이것을 지연 로딩이라 한다. 지연 로딩 기능을 사용하기 위해 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라 한다. 프록시 사용 엔티티를 실제 사용하는 시점까지 데이터베이스 조회를 미루고 싶으면 EntityManager.getReference() 메소드를 사용하면 된다. Member member = em.getReference(Member.class, "Member1"); PersistenceUnitUtil.isLoaded(Object entity) 메소드를 사용하면 프록시 인스턴스의 초기화 여부를 확인할 수 있다. boolean isLoad = em.getEnti..

상속 관계 매핑 1. 조인전략 Joined Strategy: 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략 @Entity @Inheritance(strategy = InheritanceType.JOINED) //조인 전략 사용 @DiscriminatorColumn //컬럼명:dtype public abstract class Item { @Id @GeneratedValue @Column(name = "ITEM_ID") private Long id; private String name; private int price; } @Entity //@DiscriminatorValue("A") //DiscriminatorValue를 지정하지 않..
객체의 참조와 테이블의 외래 키 매핑 방향 방향은 객체에만 존재하고 테이블 관계는 항상 양방향이다. 단방향 두 관계 중 한 쪽만 참조하는 것 양방향 두 관계 양쪽 모두 서로 참조하는 것 다중성 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:N)이 있다. 연관관계의 주인 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야 한다. 연관관계의 주인은 외래 키의 위치와 관련해서 정한다. ex) 회원과 팀 관계에서 외래 키가 있는 "다" 쪽인 회원이 연관관계의 주인이 된다. 객체 연관관계와 테이블 연관관계의 차이 객체는 참조(주소)로 연관관계를 맺는다. ex) a.getB().getC() 테이블은 외래 키로 연관관계를 맺는다. ex) A JOIN B 참조를 사용하는 객체의 연관관계는 단방향..