본문 바로가기

백엔드/스프링+boot26

예외 처리 이전에는 , 모든 exception에 대해서 try and catch를 진행했다. 모든 메소드를 거의 boolean으로 진행해서, try /catch or if절로 검사하여 return false방식으로 진행했다. ->해당 방식 문제. EXCEPTION을 별도로 생성해야 하는 문제가 발생한다. + 실패와 성공 각각을 DTO에 담아야 하는 , 복잡하고 이상한 형태의 구조가 동작된다. DTO에는 정보에 대한 것 뿐만 있어야하고, 예외등의 문제 관련하여는 존재해서는 안된다. -> 대부분을 VOID로 단순화하여, 예외를 생성하는 METHOD를 별개로 만든다. 코드의 간략화 , DTO의 간략화 예외만을 확인 예외를 던질지 말지를 실제 메소드에서 확인하고 넘어간다 (비지니스 VALIDATION) 이제 던져진 예외에.. 2023. 12. 29.
스프링. 상세히 데이터 관리및 조회 spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true 둘을 모두 properties에 추가해주어야, 사용이 가능 (baeldung가 보기 편한 것 같다) 1. sql쿼리를 출력하고 2. sql 형식을 읽기 쉽게 포멧한다. 현재 있는 DEVELOPERS를 가져오는 것을 만들어 보자. 실제 객체 Developers에 직접 접근은 지양해야한다. Dto를 새로 생성하는 것이 유리하다. 유연성, 안전성 필요한 정보만 들어있는, developer dto (from entity는 entity부터 생성되었다는 뜻! ) GET METHOD 사용시, 잘 확인됨이 보인다. 이번엔 한개를 따로 상세히 id를 입력받고, 해당 정보를 return하자. .. 2023. 12. 28.
EXCEPTION 모든 생성 EXCEPTION의 부모는 EXCPETION임을 기억하고 . 서비스 단에서 실제 DB를 저장하기 전에, REQUEST를 받아서 이를 DEVELOPER 객체에 넣기도 전에, DATA VALIDATION을 수행한다. 이때 단순한 EXCEPTION 만으로는 검증될 수 없기 때문에, 사용자 설정 EXCEPTION을 생성한다. 해당 예시. 물론, DMakerException을 객체로 따로 만들어주어 이를 준비해야한다. RuntimeException을 상속받는 exception. ERRORCODE객체와 MESSAGE를 내부 변수로 가지고 있으며, ERRORCDE를 받아 해당 ERRORCDE가 CODE만 있을때는 그 ERRORCODE와 기본 MESSAGE를. 그렇지 않을땐 모두를 대입한다. SUPER는 E.. 2023. 12. 28.
Validation 앞서, validation을 진행했던 기억이 있다 . (원하는 데이터 혹은 정보가 잘못된것이 없는지 확인하는 것) @Valid! 들어온 값들은 requestbody에 넣는데, 이때 제약했던 @NotNull이나 기타 등등 제약들을 맞는지 확인해준다. 이러한 과정을 data validation이라고 한다. 이제, 조금더 복잡한 (특정 요구사항에 따른) BUISNESS VALIDATION을 사용해보자 . 이와 같이, 특정 EXCEPTION을 활용하고 생성하여 BUSINESS VALIDATION을 진행할 수 있다. 해당 EXCEPTION 생성은 추후 EXCEPTION 부에서 다시 설명하겠다. ++ 자바 8부터 추가된 기능인 ifPresent((developer -> { throw new DMakerExcepti.. 2023. 12. 28.
Transaction, Transactional @Transactional 이때 @Transactional이 왜 필요할까? 일단 예시부터. 은행에서 만원을 뺐는데, 상대방은 만원을 못받는 경우가 있을까? 없다. 이를 기본으로 트랜잭션의 성질을 보자 1. Atomic(원자성) 돈을 빼는것과, 돈을 받는 작업이 한개의 트랜젝션으로 묶여서! 두 작업이 모두 성공하거나 모두 실패해서 빼긴 성공해씅나 받을때 에러가 나면, rollback 된다. 2.일관성(COnsistency) db저장된 파일은, 일정 규약을 따라야한다. 트랜젝션이 끝나는 점에서는 이러한 일관성이 맞춰저 있어야하고, commit이 끝나는 지점에서는 맞춰져 있어야한다. 예시로, 잔고는 0원 이상인데, 중간엔 0보다 적을수있지만 commit이 끝날때는 반드시 0보다 커야한다. 3. 고립성(isol.. 2023. 12. 28.
H2 database , DB활용 / Entity 추가 / Repository,service 간단 복습 application properties에 해당 내용 추가해주어야, http://localhost:8080/h2-console 로 입장시 뜬다. 역시 spring 사이트 자체를 잘 활용하자. 초간단 db h2 db에 접근 성공 . @ENTITY를 붙인순간, 엔티티로 들어갈 것임을 공표한것과 마찬가지이기 때문에, CLASS에 규약이 생긴다. @Enumerated(EnumType.STRING) private Developerlevel developerlevel ; DeveloperLevel이라는 열거형이 있다. 이를 enumtype으로 지정하여 내 entity의 변수로 쓸 것이다 ! enum이 클라스와 대응하는 관계의 객체임을 배웠다. (반대란 의미는 아니고 개념이 변수가 아니라고) descriptrion을.. 2023. 12. 27.
Controller , componet 어노테이션. CLASS, 컴포넌트, 모듈 . Controller 사용자의 입력이 최초로 받아들여지는 곳 @Restcontroller -> 완성할 bean이 , restcontroller라는 type으로 등록. response body가 자동으로 달린다. 즉 , RESTAPI를 입력으로 받는 진입점으로 사용하겠다 사실상 @Component이다. @Component ? 가장 기본적인 방식. -> 최소한의 단위 . 모듈로써 시스템을 유지보수하는 부품. 컴포너트는 클래스와 다른 개념이고 , interface를 통해서만 접근할 수 있다. 모든 빈은 컴포넌트이지만 모든 컴포넌트가 빈은 아님. 어노테이션으로 해당 class가 빈임을 알린 형태. '기능, 혹은 시각적인 하나의 요소 ' 완성한 CLASS를 COMPONENT로 등록할때는 @COMPONENT를, 완성.. 2023. 12. 27.
롬복 + Dto 상세 롬복이 무엇인가 ? 보일러 플레이트 코드들을 자동으로 생성해주는 필수적인 library build.gradle의 dependecies에 추가 . 설정이 필수적으로 같이 와야 됨. 앞서 작성했던 라인에서, dependices에 추가 혹은 spring.io에서 세팅 완료된 파일을 다운로드 . setter , getter을 @Setter @Getter로 class앞에 생성. -> 추가적인 메소드 작성이 필요없이, set,get등을 사용할 수 있다. @ToString -> class devdto를 그대로 sout으로 출력했을때, hash 코드 값이 출력되는데 이를 붙이면, 이에 맞는 시간과 , age등 형식에 맞추어서 출력된다. 생성자 @NoArgsConstructor -> argument가 없는 생성자 All.. 2023. 12. 27.
테스트 로그인 회원가입 프로젝트때 test를 하지 않고 만들어서 끝난후 오류 찾으려니 힘들었던걸 기억하자 . 짧은 단위로 테스트를 해주는 것이 굉장히 유리하다. class 들어간 후 -> 우클릭, 생성 . @ExtendWith(MockitoExtension.class) -> servicetest의 시작에 추가되는 어노테이션 @MOCK? 나무위키 출처 모의 객체(Mock Object)란 주로 객체 지향 프로그래밍으로 개발한 프로그램을 테스트할 경우 테스트를 수행할 모듈과 연결되는 외부의 다른 서비스나 모듈들을 실제 사용하는 모듈을 사용하지 않고 실제의 모듈을 "흉내"내는 "가짜" 모듈을 작성하여 테스트의 효용성을 높이는 데 사용하는 객체이다. DB없이 어떻게 DB를 테스트할것이냐에 대한 답의 의미 . mock은 .. 2023. 12. 25.
Controller api 구성 요소를 확인한다. server의 요청을 받는다. 어떤 작업을 요청하고 내려줄지 를 구현한다. 즉, api의 요청에 따라 무엇을 할까? 를 의미한다고 이해하였다. 사용자의 입력이 최초로 받아들여지는 위치 . @RestController로 시작 @CROSSORIGIN CORS정책을 우회한다. CORS? 스크립트가 다른 출처(포트,도메인중 하나라도) 다르다면, 리소스 접근을 제한한다. CROSS ORIGIN(origins="httlp://localost:3000" ) 과 같이, 특정 출처에서의 요청을 허용한다. @RequestMapping("/") 기본 url을 설정한다. mapping을 어노테이션을 통해 진행한것. @postmapping 복습) post란, 여러개 자원에 수행되며, data를 u.. 2023. 12. 21.