java 93

쿼리조인과 스칼라 서브 쿼리

현재 이지업에 강의를 보면서 진행하는 프로젝트에서 사용자의 구동 적보를 관리하는 기능이 있다. 이기능은 까다로워서 프로그램을 설계해서 짜게되면 프로그램도 지저분해지고 엄청 복잡해 진다. 그래서 이런 복잡한 기능은 쿼리를 잘 짠다면 엄청깔끔하게 프로그램을 작성할 수 있게된다. 쿼리를 짜는 실력이 늘기위해선 해당 포스팅에서 보여주는것과 같이 생각을하면서 점차점차 목표하는 쿼리를 만들기위해서 생각하고 연습하고 노력해야한다. 다음과 같은데 위 기능이 구현하기 까다로운 이유는 user정보도 있고 구독여부 정보와 사용자와 중복 여부까지 체크를 해야 한다. 이렇게 하기 위해서 쿼리를 짜야한다. 조인을 해야하는데 조인은 다음과 같이 데이터를 검색해 준다. 2번이 구독하고 있는 user들을 검색하는 쿼리를 짜고 이제 구..

Springboot 2021.12.24

@Service단에서 DB에 변형을 줄때 왜 @Transactional을 습관처럼 꼭 걸어줘야할까?

일의 최소 단위를 트렌젝션이라고 한다. Service를 하는 파일에서 DB에 변형을 주는 행위를 만들 때 @Transactional가 있으면 어떤 일이 일어날까? 트렌잭션을 수행하던도중에 오류가 나면 해당 트렌젝션 자체를 롤백을 해주기 때문에 DB의 무결성에 큰 문제가 생길 일을 막아 줄 수 있다. 그럼 select할때도 @Transactional을 걸어줘야 하는 이유가 뭘까? 영속성 컨텍스트는 sevice가 끝나는 시점에 변경된 오브젝트를 감지를 한다.(감지된다면 db에 자동 flush(더티 체킹)) @Transactional(readOnly =true)를 걸게되면 더티체킹을 하지 않고 읽기 전용 트렌젝션이 된다.

Springboot 2021.12.24

이미지 업로드 폴더를 프로젝트 외부에 두는 이유

프로젝트 내부에. java(코드) 파일들이. class파일로 컴파일되면서 서버가 실행된다. 프로젝트 내부 default폴더중 target폴더들이 있는데 이 target폴더는 스프링에서. java파일들을 컴파일할 때. class로 변환된 파일을 target폴더로 옮기고 최종으로 서버가 실행될때는 target폴더를 실행한다. 위 구조로 실행이된다. 이미지 업로드 폴더를 프로젝트 내부에 두게 된다면 컴파일해서. class파일과 함께 이미지 같은 정적 파일을 target폴더에 넣는 것을 deploy(배포)라고 한다. 이미지 파일들을 프로젝트 외부에 둬야 하는 이유 - target폴더로 컴파일될 때 너무 무겁다. -deploy 될 때 이미지를 업로드하는 시간보다. java파일을 컴파일하는 것이 훨씬 빠르기 때문에..

Springboot 2021.12.19

현재 진행 중인 프로젝트에서 구독하기 API구현하기 (2)/구독,구독취소 API만들기

API라고 하는 이유는 데이터만 리턴하는 컨트롤러만 만들 것이기 때문입니다. Service에서 받는 매개변수가 int이기때문에 오브젝트 타입인 fromUserId나 toUserId를 좀 더 편하게 받아내고 내 의도대로 insert와 delete를 해주기 위해서 native쿼리를 짜서 설계했습니다 예외 처리하기 똑같은 유저가 다시 구독하기를 똑같은 유저한테 하게 되면 예외가 발생한다. API주소 시큐리티 설정하기

Springboot 2021.12.17

현재 진행 중인 프로젝트에서 구독하기 API구현하기 (1)연관관계/모델만들기

연관관계 먼저 구독하기 API를 구현함에 앞서서 연관관계에 대해서 분석을 해야 한다. 기본적인 공식 제1 정규형인 원자성만 지켜지면 웬만해선 다 해결된다. - 1 : N의 연관관계에서는 폴인키(FK)를 Many가 가진다. - N : N 의 관계가 됐을 때는 테이블을 쪼개서 중간 테이블을 만들어 관리한다. -그리고 이 중간 테이블과의 관계는 중간 테이블이 1, 연관 테이블이 N이 된다. 구독하기는 유저끼리 서로가 해주는 것이기 때문에 N:N의 연관관계가 나온다. 그렇기 때문에 위 공식에 맞게 중간 테이블을 만들어서 관리를 해준다. 모델 만들기 @Table을 사용해서 fromUser와 toUser가 구독을 했을 때 한 번만 db에 등록되도록 Unique제약조건을 걸었다

Springboot 2021.12.17

Springboot/현제프로젝트에서 Optional처리하기

현제 프로젝트에서 회원 수정을 하는 로직입니다. 22번 줄에 회원을 셀렉트 하기 위해 기본키를 사용하는데 이때 만약에 DB에 없는 데이터를 select를 하게 되면 오류가 나게 됩니다. 이 부분을 잡기 위해서는 orElseThrow()를 사용해야 합니다. 람다식으로 작성했는데 exception을 날릴 때 공통으로 처리하는 @ControllerAdvice에서 관리하는 공통 Exception처리를 사용해서 예외를 날리도록 처리했다.

Springboot 2021.12.16

Springboot/현제 진행중인 프로젝트에 AOP처리해보기/@ControllerAdvice사용

org.springframework.boot spring-boot-starter-validation 2.4.4 위 maven은 2.4.4 버전이다. porm.xml에 의존성 추가. validation 체크 관련 어노테이션은 해당 블로그가 굉장히 잘 돼있습니다. 참고하시면 좋을 것 같아요!. https://bamdule.tistory.com/35 [Spring Boot] @Valid 어노테이션으로 Parameter 검증하기 java.validation의 @Valid 어노테이션 사용법 정리 글입니다. Spring Boot 라이브러리에서 기본적으로 탑재된 기능이며 따로 dependency해 줄 필요가 없습니다. Spring Boot Version은 2.2.2.RELEASE 입니다. 1. j.. bamdule...

Springboot 2021.12.11

전처리 후처리 개념 (AOP)

클라이언트가 실수로 잘못된 데이터로 서버에 요청을 할 수도 있고 서버에서도 오류창을 리턴을하는데 이 오류창 또한 보안상, 그리고 사용자 ux 불만 등등 많은 안 좋은 영향을 끼친다. 전처리는 클라이언트가 데이터를 입력을 하기도 전에 오류가 날것같은 데이터를 입력하지 못하도록 막는 것이다. 즉 꼭 서버를 건들지 않더라도 앞단에서 처리를 할 수 있는 일들을 전처리라고 한다. 전처리를 흔히 Validation체크를 한다고 한다. 후처리를 꼭 서버에서 체크를 해 봐야 알 수 있는 것 들이다. (DB를 타야만 하는 로직들) 후처리를 흔히 exceptionhendler라고 한다. 그럼 위 그림처럼 어떤 요청을 처리할 때는 클라이언트가 어떤 데이터를 요청할지 모르기 때문에 재한 사항을 줘야 한다. 위 그림에서 처럼 ..

Springboot 2021.12.11

Springboot/현재 진행 중인 프로젝트에서 build패턴 사용, @Service/@Transactional/@Bean 사용법

지금 만들고 있는 web에 공부하면서 알게된 로직들을 포스팅했습니다. build패턴 모델에 Builder어노테이션 dto에 다음과 같은 함수를 만들면 user에 잘 담겨진다. @Service AuthController에서 AuthService클래스 파일을 di(의존성 주입)을 시킨다. 스프링이 IOC컨테이너에 AuthController객체를 생성해서 메모리 로드를 할 때 조건이 생성자 실행이다. 스프링 입장에서 생성자를 실행하려 하는데 생성자 매개변수로 AuthService가 들어가 있으면 AuthService를 주입해 주기 위해 IOC컨테이너를 찾아다닌다 (IOC에 없으면 생성자 실행이 안돼서 오류남). 그래서 @Service를 사용해서 AuthService를 ioc에 등록해주고 의존성 주입을 해주는 ..

Springboot 2021.12.11

http쿼리스트링, 주소 변수 매핑

1. 구체적인 데이터 요청 시에 쿼리 스트링이나 주소 변수 매핑이 필요하다. 2. 스프링부트에서는 주소 변수 매핑을 주로 사용한다. 훨씬 편리하다. 쿼리스트링은 구체적인 요청을 할 때 "?"를 사용해서 이 "?"를 기준으로 그 뒤에 키와 값의 형태로 데이터를 요청을 하는 것이다. 쿼리스트링방식 위와 같이 구체적인 요청을 쿼리 스트링을 통해서 할 수 있다. 메서드의 파라미터를 전달해주기만 하면 된다. @Pathvariable방식 {type}으로 해놓고 매개변수로 type을 한 후 @Pathvariable로 ioc컨테이너에 등록해 놓으면 스프링에서 자체적으로 파싱 해서 값을 쏙 넣어준다. 스프링에서는 쿼리스트링보단 @Pathvariable을 선호한다.

Springboot 2021.12.09