spring

아래 세가지 지원 기능은 제약이 커서 복잡한 실무 환경에서의 사용은 선택적으로! 1. 인터페이스 지원 - QuerydslPredicateExecutor Pageable, Sort 지원 // 리포지토리에 적용 public interface MemberRepository extends JpaRepository, CustomMemberRepository, QuerydslPredicateExecutor { ... } // 서비스에서 사용 Iterable result = memberRepository.findAll( member.age.between(10, 40) .and(member.username.eq("1"))); 한계 외부 조인 불가능 (묵시적 조인 가능) 클라이언트가 Querydsl 구현기술에 의존 2...
스프링 데이터 JPA 리포지토리로 변경 public interface MemberRepository extends JpaRepository { List findByUsername(String username); } 테스트 @SpringBootTest @Transactional class MemberRepositoryTest { @Autowired EntityManager em; @Autowired MemberRepository memberRepository; @Test public void basicTest() { Member member = new Member("member1", 10); memberRepository.save(member); Member findMember = memberReposit..
순수 JPA 리포지토리와 Querydsl 스프링이 주입하는 em은 실제 동작 시점에 트랜잭션 단위로 진짜 엔티티 매니저를 찾아주는 프록시 엔티티 매니저임 JPAQueryFactory를 메인 어플리케이션 클래스에 Bean으로 등록하고, 리포지토리에서 주입받아도 됨 장점: @RequiredArgsConstructor 활용해 리포지토리 코드 짤 때 깔끔함 단점: 두 개를 주입받아야 하므로 테스트코드 짤 때 불편함 @Bean JPAQueryFactory jpaQueryFactory(EntityManager em) { return new JPAQueryFactory(em); } 리포지토리 @Repository public class MemberJpaRepository { private final EntityMan..
* F2: IntelliJ 오류난 곳으로 바로 이동 프로젝션과 결과 반환 - 기본 프로젝션: select 대상 지정 튜플은 querydsl 종속적인 자료형이기 때문에 repository 계층이 아닌 controller나 service 단에서는 사용 지양 다른 계층으로 넘길 때는 DTO 사용 권장 // 프로젝션 대상 하나 @Test public void simpleProjection() { List result = queryFactory .select(member.username) // 이름만 지정 .from(member) .fetch(); for (String s : result) { System.out.println("s = " + s); } } // 프로젝션 대상 여러개 @Test public voi..
기초 설정 스프링, Querydsl 버전에 따라 설정하는 법이 계속 바뀜 강의 수강 시점에서의 설정 방법: https://www.inflearn.com/chats/669477 Q파일은 gitignore Q타입 생성 확인 후 테스트 케이스로 실행 검증 h2 설치 및 설정 -> sql 로그 출력, 쿼리 파라미터 로그 출력(운영 단계에서는 성능 테스트하고 사용) # application.yml spring: profiles: active: local datasource: url: jdbc:h2:tcp://localhost/~/querydsl username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create proper..
경로 표현식 .(점)을 찍어 객체 그래프 탐색 상태 필드: 단순히 값을 저장하기 위한 필드 예: m.username 연관 필드: 연관관계를 위한 필드 단일 값 연관 필드: 대상이 엔티티, @ManyToOne, @OneToOne 예: m.team 컬렉션 값 연관 필드: 대상이 컬렉션, @OneToMany, @ManyToMany 예: m.orders 특징 상태 필드: 경로 탐색의 끝, 더 이상 탐색 불가 예: select m.username, m.age from Member m 단일 값 연관 경로: 묵시적 내부 조인 발생, 더 탐색 가능 예: select o.member from Order o 탐색 시 자바로는 .(점)만 찍으면 되기 때문에 편하지만 db에서는 조인이 일어나므로 사용 지양 컬렉션 값 연관 경..
소셜 로그인을 제외하고 백엔드에서 맡은 API는 모두 구현하고, CORS 설정까지 마친 후 배포했다. 오늘의 관건은 엑셀파일에 저장한 데이터를 MySql로 코드를 통해 저장하는 것과 CORS 연결이었다. 1. 엑셀 MySql RDB에 저장 코드로 xslx 파일을 열어 첫번째 시트의 각 행에 대해 for문으로 돌면서 각 열의 데이터를 추출해 미리 만들어논 엔티티에 넣고, 그 엔티티들을 리스트에 넣어 최종적으로 saveAll을 통해 저장했다 https://shinsunyoung.tistory.com/71 SpringBoot의 POI을 이용해서 엑셀 파일 읽기 안녕하세요! 이번 포스팅에서는 SpringBoot의 POI를 이용해서 엑셀 데이터를 읽고 뷰에 뿌리는 코드를 작성해보겠습니다. 👩🏻‍💻 전체 코드는 G..
주특기가 끝나고 처음 프론트와 협업을 시작했다. 아리송했던 프론트와의 연동 방식에서 우린 하던대로 JSON으로 변수명과 형식만 잘 맞춰서 데이터를 잘 넘겨주기만 하면 되고, CORS 설정과 추후에 EC2의 IP 주소만 잘 알려주면 문제없을 것이란 답변을 듣고 생각보다 복잡하진 않은 것 같아서 다행이란 생각을 했었다. 프로젝트 설계 단계에서 영화를 검색하면 그것을 서비스해주는 OTT를 알려주는 사이트로 정했었는데, 구현 가능할지 애매해서 좀 더 스코프를 좁게 잡아 SA를 진행했다. 이후 혼자 방법을 찾은 끝에 원하던 것을 구현에 성공해서 큰 뿌듯함을 느끼기도 했다. (TMDB 만세!) CORS (Cross-Origin Resource Sharing) 추가 HTTP 헤더를 사용하여, 한 서버에서 실행중인 웹..
1. Spring @Transactional public ResponseDto togglePostLike(Long postId, HttpServletRequest request) { //... LikePost checkLike = likePostRepository.findByPostIdAndMemberId(post.getId(), member.getId()); if (checkLike == null) { // like 등록 LikePost likePost = LikePost.builder() .member(member) .post(post) .build(); likePostRepository.save(likePost); } else { // like 취소 likePostRepository.deleteBy..
1. Spring 스프링 info level log 달기 @Slf4j log.info("게시물 이 삭제되었습니다.", post.getTitle()); 저번주 JPA 연관관계 정리 @Column에 name 속성을 따로 지정하지 않으면 그 필드명으로 자동 지정 @JoinColumn 외래키 매핑할 때 사용하는 어노테이션 1:N 관계인 경우 보통 N쪽에 외래키를 두므로 연관관계의 주인이 되며 해당 어노테이션을 붙힌다 연관관계의 주인 = 외래키 관리(등록, 수정, 삭제) 양방향인 경우 주인이 아닌 1쪽에 mappedBy를 사용하여 주인이 아님을 알려준다 // 댓글이 연관관계의 주인 // 게시글에서 댓글 객체를 불러와 사용 가능 @OneToMany(mappedBy = "article") private List co..
hjkim0502
'spring' 태그의 글 목록