Spring Data Jpa는 왜 interface만 생성해줘도 작동하는지에 대한 궁금증이 생겼다. 일단 먼저 spring data jpa의 기본적은 사용법부터 잠깐 보자. Spring Data Jpa사용법 interface JpaRepository를 extends받아서 새로운 interface를 만들어 사용한다. public interface CrudRepository extends Repository { //Repository는 marker repository //CrudRepository는 기본적인 CRUD내용을 담고있음 public interface PagingAndSortingRepository extends CrudRepository {...} //PagingAndSortingRepositor..
Swagger가 뭐지? 우리는 보통 swagger와 swagger-ui를 헷갈린다. 사실 swagger에서는 다양한 툴을 제공하는데, swagger-hub(깃헙처럼 다양한 api를 확인할 수 있다), swagger-ui 등을 제공한다. swagger-ui를 우리는 보통 swagger라고 부르기도 한다. swagger는 open api specification과 연관되어있다. Oepn Api Specification(OAS)는 Restful API를 위한 표준이다. Swagger Specification이라고도 하는 것 같다. Swagger는 이 표준을 준수해서 API를 만들고 소스코드 없이 이해 가능하도록 시각화하는 툴을 제공한다. 그것이 바로 swagger-ui이다. swagger는 기술의 제약을 받지..
Why? 외장 톰캣으로 어플리케이션을 재구동한다면 shutdown.sh를 실행하면되지만, 내장 톰캣(스프링 부트) 애플리케이션을 재구동한다면 일반적으로 서버 구동시 pid를 미리 저장해두고 종료가 필요한 시점에해당 pid값으로 kill한다. 바로 이 pid를 만들어주는 방법 중에 하나가 ApplicationPidFileWriter객체의 사용이다. 자동 배포를 할때, 자동으로 재구동하기위해 pid를 설정해준다. PID 만들기 PID 생성 경로 지정 spring: pid: file: test-app.pid # PID 파일 생성 경로 지정 Main 메소드 ApplicationPidFileWriter 생성 @SpringBootApplication 을 적용한 메인 Application의 main()메소드에서 아래..
lambda 먼저 lambda에 대한 설명은 여기를 참고하자. https://wouldyou.tistory.com/63 [java] Lambda 람다란? 람다함수 람다함수는 메소드를 하나의 식(Expression)으로 표현하는 것으로 익명함수(Anonymous function)를 생성 한다. 함수형 프로그래밍을 하고자 하며 나왔다고 한다. 자바에서는 메소드 혼자 선언 wouldyou.tistory.com callback만들기 functional interface를 하나 생성해준다. interface Testable { void run(); } interface를 아래와 같이 구현하면 callback처럼 사용할 수 있다. public class Example { // 인터페이스 Testable로 된 클래스..
객체지향에 대한 오해 객체지향의 목표는 실세계를 모방하는 것이아니다(설명하는데 도움은 되지만 똑같이 만들어야 좋다는 사실은 오해다) 실세계를 은유하는 것이다. 객체지향은 클래스가 아니다. 객체지향을 구현하는 방법중에서 클래스가 중요하게 다루어지는 것 뿐이다. javascript의 prototype으로 객체지향을 구현할 수도 있다. 책임주도설계 객체지향적으로 사고할 때 보통 클래스를 만들어놓고 어떤 클래스가 어떤 역할을 할지 생각하는 경우가 많은데, 오히려 그 반대의 경우가 효과적이다. 객체와 객체는 메시지를 통해 협력한다. 메시지를 먼저 찾고, 어떤 객체에게 메시지가 전달될지 찾는 것이 합당하다. 이것을 책임-주도설계라고 한다. 우리가 익히 아는 TDD도 마찬가지다. TDD는 test를 먼저 작성하며 어..
@RequestPart란? @RequestPart는 @RequestParam과 마찬가지로 String, form, multipart데이터를 받지만, JSON, multipart 복잡한 데이터를 받는데 주로 사용된다. @RequestParam VS @RequestPart VS @ ReqeustBody 그럼 차이점이 무엇일까? 이 세가지 어노테이션을 비교해보며 ReqeustPart에대해 알아보자. @RequestParam과 @RequestPart는 둘 다 파라메터를 받는데서 사용한다. String, from, Multipart 데이터를 받을 수 있다. @RequestBody는 바디에 있는 데이터를 꺼내는 역할을 한다. @RequestBody post등의 방식으로 body에 데이터를 넣어주었을 때만 사용한다...
Vite에서 절대경로로 Alias를 사용하려면 vite.config.js의 resolve.alias를 추가해 주어야 한다. import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import path from 'path'; export default defineConfig({ plugins: [react()], resolve: { alias: { '@': path.resolve(__dirname, './src') } }, }) import는 아래와 같이 할 수 있다. //test.js alert('import!') import "@/css/test" ... alias옵션의 자세한 옵션들은 아래를 참고하자 참고 https:/..
개발 중에 이러한 warning을 발견했다. ... M_OP_LINK] entity uses both @NotFound(action = NotFoundAction.IGNORE) and FetchType.LAZY. The NotFoundAction.IGNORE @ManyToOne and @OneToOne associations are always fetched eagerly. FetchType.LAZY로 써줬는데, EAGER로 동작하더라 warning을 해석해보면 ~One으로 끝나는 join 은 NotFoundAction.IGNORE와 FetchType.LAZY를 함께쓰면 언제나 FetchType.EAGER로 동작한다는 것을 알 수 있다. 왜 그럴까? 먼저 LAZY가 어떻게 동작하는지 보자. 예를 들어서 ..