전체보기

💎백엔드 : Backend

[SpringBoot] dto의 위치

DTO의 위치는 패키지 설계를 어떻게 가져가는가에 따라 완전히 달라진다 어떤 경우는 repository 계층에 있을 수도 있고, service 계층에 있을 수도 있다. 여러 패키지에서 공유해야 하는 상황이면 별도의 dto 패키지를 만들어서 넣어둠. 특정 서비스 계층까지만 사용되면, 해당 서비스 계층에 dto클래스를 함께 둔다. 특성 repository 까지 해당 dto가 사용되면 해당 repository 계층에 dto클래스를 함께 둠 궁극적으로는 패키지 응집도와 결합도를 고민하면서 가급적 다른 패키지와 연관을 줄이도록 하는 방식이 좋은 방식이다 참조 : https://www.inflearn.com/questions/24222/dto-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC..

💎백엔드 : Backend

[SpringBoot] 2.7.13 에서 swagger 오류

SpringBoot 2.7.13에서 swagger를 사용하기 위해 dependencies를 추가한 뒤 실행하였으나 아래와 같은 오류가 발생하였다 ㅠㅠ org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException 찾아보니 application.properties 에 아래 코드를 추가하면 된다고 한다 spring.mvc.pathmatch.matching-strategy=ant_path_matcher 2.6 버전 이후에 spring.mvc.pathmatch.matching-str..

💾ORM:JPA

변경 감지와 병합

준영속 엔티티 영속성 컨텍스트가 더는 관리하지 않는 엔티티 영속성 컨텍스트가 제공하는 기능을 사용햘 수 없다 기존 식별자를 가지고 있는 임의로 만들어낸 엔티티 준영속 엔티티를 만드는 3가지 방법 em.detach(entity) : 특정 엔티티만 준영속 상태로 전환 em.clear() : 영속성 컨텍스트를 완전히 초기화 em.close() : 영속성 컨텍스트를 종료 준영속 엔티티를 수정하는 2가지 방법 변경 감지 기능 (선호) em.find로 조회한 엔티티를 이용하여 데이터를 수정 병합(merge) 사용 em.merge를 실행 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체함 (병합시 값이 없으면 null로 업데이트 할 위험도 있음) 새로운 영속 상태의 엔티티를 반환함 ( 파라미터로 넘어온 엔티티는 ..

💎백엔드 : Backend

[SpringBoot] SpringBoot 정리

생성자 injection을 쓰는게 좋다 생성자 injection을 하면 setter로 entity를 바꾸는 경우를 방지할 수 있다 생성자가 하나만 있는경우 @Autowired를 생략해도 된다 MemberRepository는 변경될 일이 없기 때문에 final로 해주는게 좋다 test case를 작성할 때 컴파일 단계에서 injection을 명확하게 알 수 있다 ( 아래 코드와 같이 ) @RequiredArgsConstructor final이 있는 필드만을 가지고 생성자를 만들어 준다 결국 자동으로 생성자를 하나 만들고 injection을 받을 수 있음 @PersistenceContext -> @Autowired @PersistenceContext 를 @Autowired로 대체할 수 있음 (SpringBo..

💾ORM:JPA

@Transactional

@Transactional JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 한다. 트랜잭션 없이 데이터를 변경하면 예외가 발생 @Transactional(readOnly=true) 조회하는 곳(읽기 동작)에 작성해주면 성능을 최적화 할 수 있음 쓰기에서는 X 클래스 최상단에 @Transactional(readOnly=true) 를 적어주고, 쓰기하는 곳에는 @Transactional을 적어주는 방식으로 구현 했음

💾ORM:JPA

@JoinColumn

다대일 연관관계에서 @JoinColumn(name) 컬럼 이름 매핑에 사용되는 어노테이션 연관관계에는 아무런 영향이 없다 조인 대상 컬럼을 변경하기 위해 @JoinColumn(referencedColumnName)을 활용할 수 있다! 따라서 무조건 @JoinColumn을 생략해선 안된다 일대다 단방향 연관관계에서 @JoinColumn @JoinColumn 어노테이션을 꼭 명시해줘야 한다. 그렇지 않으면 중간 테이블을 자동으로 생성함 일대다 양방향 연관관계에서 @JoinColumn 연관관계의 주인을 일(1)에게 주려 하는 경우 다(N)쪽에 @JoinColumn(insertable=false, updateable=false)를 사용하면 연관관계의 주인을 강제시킬 수 있다. 참고 : https://hyeon9..

💾ORM:JPA

JPA 쿼리 ( JPQL )

JPA는 다양한 쿼리 방법을 지원한다 JPQL (거의 대부분 JPQL로 해결) QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 과 함께 사용 JPQL이란? : 객체지향 SQL JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어(테이블이 아닌 객체를 대상으로 검색)를 제공 SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 SQL을 추상화해서 특정 데이터베이스 SQL에 의존X JPQL은 결국 SQL로 변환된다 프로젝션(SELECT) SELECT m FROM Member m : 엔티티 프로젝션 결과로 나온 여러개의 엔티티가 전부 영속성 컨텍스트에서 관리가 된다 아래 코드를 보면 up..

💾ORM:JPA

값 타입, 값 타입 컬랙션

값 타입 수정 값 타입은 immutable 해야 함 값 타입의 setter로 수정하면 안됨 update문이 나가지만 side effect를 일으킬 수 있음 Member findMember = em.find(Member.class,member.getId()); // 값타입 Address의 homeCity 를 newCity로 바꾸고 싶음 findMember.getHomeAddress().setCity("newCity"); // 이렇게 하면 안됨 아래와 같이 새로운 Address로 갈아끼워야 한다 // 값타입 Address의 homeCity 를 newCity로 바꾸고 싶음 Address a = findMember.getHomeAddress(); findMember.setHomeAddress(new Addres..

mc.thd
'분류 전체보기' 카테고리의 글 목록 (9 Page)