spring boot 25

Spring Boot에서 GraphQl 적용해보기

블로그에 쓸 기능들 정리한 깃헙입니다 https://github.com/YuSunjo/spring-boot-example GitHub - YuSunjo/spring-boot-example: spring boot 간단한 예제 모음(블로그 용도) - s3이미지 업로드, nfs를 통 spring boot 간단한 예제 모음(블로그 용도) - s3이미지 업로드, nfs를 통한 이미지 업로드, FCM, Feign-Client, GraphQl - GitHub - YuSunjo/spring-boot-example: spring boot 간단한 예제 모음(블로그 용도) - s3이미지 업로 github.com 먼저 graphql을 사용하기에 앞서 무엇이고 왜 사용해야하는지 알아보겠습니다. GraphQl이란? GraphQL..

spring boot에서 filter

spring mvc request lifecycle 위의 사진은 spring이 컨트롤러 까지 가는데의 과정입니다. 보통 웹 개발을 하다보면 중복으로 처리하는 코드들이 많이 생깁니다. 인증, 인가, 세션, xss 방어 등을 필터, 인터셉터, AOP 등 상황에 맞게 처리합니다. 먼저 필터를 보겠습니다. http 요청 및 응답을 가로채는데 사용됩니다. request를 필터링 response를 필터링 @Component public class SampleFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { Filter.super.init(filterConfig); } @Ove..

spring boot 에서 argumentResolver

api 엔드 포인트로부터 들어온 데이터를 가공하여 필요한 데이터만 뽑는 경우 많이 사용한다. argumentResolver는 interceptor 요청 뒤에 이루어집니다. 예시로 argumentResolver로 memberId를 뽑아보도록 하겠습니다. 만약 argumentResolver가 없다면?? @GetMapping("/memberId") private void memberId(HttpSession session){ ... Long memberid = session.getAttribute("memberId"); ... } 이렇게 컨트롤러마다 memberId를 뽑아야합니다.... 그래서 argumentResolver를 사용해보겠습니다. @Target(ElementType.PARAMETER) @Reten..

spring boot 에서 interceptor

이전에 filter에 대해 보았습니다. https://balldev.tistory.com/41 [spring의 dispatcher-servlet와 filter dispatcher servlet 이 해당 애플리케이션으로 들어오는 모든 요청을 핸들링 해주고 공통 작업을 처리하면서 편리하게 이용이 가능하다!! ** 예전에는 모든 서블릿에 대해 URL 매핑을 web.xml에 해줬어야 balldev.tistory.com](https://balldev.tistory.com/41) 인터셉터는 컨트롤러 가기 전, 후로 나뉩니다. 인증관리 등 여러경우에 은근 쓰이는것 같습니다. filter와의 차이 사진을 보시는 것과 같이 filter와의 차이는 dispatcher servlet의 앞에 있냐 뒤에 있냐입니다. 그리고 인..

JPA - cascade, orphanRemoval

cascade 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 기능 예) 게시글과 게시글 좋아요의 관계 public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true) private final List boardLikeList = new ArrayList(); .. 생략 } public class BoardLike { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Many..

JPA - proxy(프록시)

printMember(Member member) { member.getUsername(); // username만 가져오면 되는데 team 정보도 가져오면 성능상 손해 } printMemberAndTeam(Member member) { member.getTeam(); member.getUsername(); } 지연로딩, 프록시로 해결 가능 프록시 em.getReference() - 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 초기화 할 때는 sql 이 생성 안되고 아래처럼 사용 될 경우 호출함 System.out.println("findMember.username = " + findMember.getUsername()); proxy가 값을 가지고 있으면 그 proxy객체에서 반환 없으면 초..

JPA - 상속관계 매핑

상속관계 매핑 - 3가지 종류가 있음 - 조인전략, 단일 테이블 전략, 구현 클래스마다 테이블 전략 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 RDB에는 없음 @Entity @Inheritance(전략은 고를 수 있음) public abstract class Item { @Id @GeneratedValue private Long id; private String name; private int price; } @Entity public class Album extends Item { private artist; } 위의 엔티티로 예시 조인전략 조인 전략 -- 정석적인 전략 @Inheritance(strategy = InheritanceType.JOINED) //이거 없으면 그냥 한 테이블..

JPA - 연관관계 매핑(2)

@ManyToOne 단방향, 양방향 테이블 - 외래 키 하나로 양쪽 조인가능 객체 - 참조용 필드가 있는 쪽으로만 참조 가능 객체 양방향 관계는 참조가 2군데가 있어서 외래키를 관리할 곳을 정해야함 주인의 반대편: 외래 키에 영향을 주지 않음 단순 조회만 가능 다쪽에 외래키가 있음 @ManyToOne @JoinColumn(name="team_id") private Team team; @OneToMany(mappedBy = "team") private List memberList = new ArrayList(); @OneToMany - 잘 안쓰임.. 테이블에는 다쪽에 외래키가 있어서 외래키가 매칭이 맞지 않음 ⇒ 다대일 양방향이 더 좋다. @ManyToOne @JoinColumn(name="team_id"..

JPA - pageable을 이용한 paging

이런식으로 페이징이 되어있는 사이트가 많이 있다. JPA 에서 또 Spring Data jpa 프로젝트에서는 효과적으로 페이징을 처리할 수 있게 방법을 제공한다. 제가 프로젝트 하면서 사용한 코드들인데 나중에도 기회가 되면 쓰려고 정리합니다 ㅎㅎ 먼저 querydsl을 사용하지 않고 spring data jpa를 사용할 때부터 보겠습니다. spring data jpa 사용법은 https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation 여기를 봐주세요. PageRequest.of에는 page(0부터 시작) size를 적어주면 됩니다. Pageable pageable = PageReque..

JPA - 연관관계 매핑

단방향 연관관계 @Entity public class Member { ... @ManyToOne(fetch = LAZY) @JoinColumn(name="TEAM_ID") private Team team; } 음 보기 불편하니까 em.persis() 이런건 생략하겠습니다. 하지만 중요합니다! Team team = new Team("teamName"); Member member = new Member(); member.setUsername("member1"); member.setTeam(team); 위처럼 team 자체를 넣어주면 된다. 양방향 연관관계 @Entity public class Member { ... @ManyToOne(fetch = LAZY) @JoinColumn(name="TEAM_ID")..