Spring Framework

요약repository.getReferenceById()를 이용해 프록시 객체를 생성하고, 엔티티 생성 parameter에 엔티티 대신 넘긴다getReferenceById()는 JPA에 정의되어 있기 때문에 구현 없이 쓰면 된다프록시 객체는 Primary key(id) 만 초기화되어 있고, 다른 값은 모두 null인 객체이다설명Foreign Key가 있는 레코드를 생성할 때, DBMS에서는 Foreign Key(user_id 등)만 알면 INSERT문으로 레코드를 생성할 수 있다. 그러나 이를 JPA 코드로 표현하면 FK 뿐만 아니라 관계된 전체 객체가 필요한 것처럼 보인다.Habit habit = Habit.creationBuilder() .runTime(param.getRu..
사용 범위Service Layer에서 DTO를 return한다도메인을 보호하기 위해서도메인이 변경됐을 때 Controller에 미치는 영향을 줄이기 위해서Controller가 도메인에 의존하지 않게 하기 위해서DTO - Domain 변환은 Mapper class가 수행한다`MapStruct` 라이브러리를 이용해서 편리하게 구현할 수 있다목적많은 매개변수를 일괄 처리원격 작업을 할 때 네트워크 오버헤드 감소직렬화 로직 캡슐화직렬화 로직을 DTO 클래스로 모아서 변경 지점을 하나로 만듦Domain 모델을 Presentational 모델과 분리하여 두 모델을 독립적으로 변경할 수 있게 한다 참고 자료https://hudi.blog/data-transfer-object/ DTO의 개념과 사용범위DTO는 우테코 ..
스프링스프링과 객체 지향의 관계스프링은 다음 기술로 다형성, OCP, DIP를 가능하게 지원DI(Dependency Injection): 의존 관계, 의존성 주입DI 컨테이너 제공자바 객체를 컨테이너에 넣고 안에서 의존 관계를 연결하고 주입하는 기능 제공클라이언트 코드의 변경 없이 기능 확장구현체를 쉽게 교체할 수 있다스프링이 없을 때는OCP, DIP 원칙을 지키며 개발하다 보니 할 일이 많았다⇒ 프레임워크로 만들어버림순수하게 자바로 OCP, DIP 원칙을 지키면서 개발을 해 보면 DI 컨테이너 (스프링 프레임워크)를 만들게 된다정리모든 설계에 역할과 구현을 분리해야 한다역할만 정의해 두고 구현체는 유연하게 변경할 수 있도록 만드는 것이 좋은 객체 지향 설계이다다형성, OCP, DIP를 지켜야 함스프링 ..
자바 언어의 다형성다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다다형성의 본질인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다협력이라는 객체 사이의 관계에서 시작해야 함클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다ex) Repository를 상속하는 MemoryRepository, JdbcRepository 로 변경 가능역할과 구현을 분리유연, 변경 용이기존의 클라이언트 코드에 영향을 주지 않는다확장 가능한 설계인터페이스를 공유하기 때문에 가능한계인터페이스가 변경되면 클라이언트, 서버 모두 큰 변경 발생인터페이스를 안정적으로 잘 설계하는 것이 중요스프링과 객체 지향다형성이 가장 중요스프링은 다형성을 극대화해서 이용할 수 있게 도..
배경클라이언트가 서버로 요청하면 응답WASTCP/IP 커넥션 연결Servlet 호출서블릿 객체를 누가 호출하는가?⇒ 쓰레드쓰레드애플리케이션 코드를 순차적으로 실행프로세스프로세스: 프로그램 실행쓰레드: 프로그램 안에서 여러 가지 갈래로 나뉨자바 main() method를 처음 실해아면 main이라는 이름의 thread가 실행자바 애플리케이션을 실행시키는 주체가 threadthread가 없다면 자바 애플리케이션 실행 불가능쓰레드는 한 번에 하나의 코드 라인만 수행동시 처리가 필요하면 thread 추가로 생성단일 요청 - thread 하나 사용요청이 온다쓰레드 할당쓰레드로 서블릿 코드 실행응답 후 쓰레드 휴식다중 요청 - thread 하나 사용한다면요청2 들어옴요청1의 쓰레드의 서블릿 처리가 지연되고 있음DB..
상황Actuactor -> Promethus -> Grafana 구조를 구현하려고 한다자바 백엔드 서버는 로컬 서버 loacalhot:3000에서 실행하고 있다Prometheus는 docker 인스턴스 :9090 포트로 띄우고 있다Grafana도 docker 인스턴스 :80 포트로 띄우고 있다아래 블로그 글을 참고했으나 버전이 바뀌어 맞지 않는 부분이 있다https://hudi.blog/spring-boot-actuator-prometheus-grafana-set-up/그래서 Grafana에서 대시보드를 띄워도 "No Data" 에러가 발생한다. Application도 읽지 못 한다 해결법prometheus.ymlscrape_configs: - job_name: 'prometheus' static..
https://hudi.blog/spring-boot-actuator-prometheus-grafana-set-up/ Spring Boot Actuator, Prometheus, Grafana를 사용한 스프링부트 모니터링 환경 구축 이 포스팅에서는 Spring Actuator, Prometheus, Grafana를 사용하여 스프링부트 애플리케이션과 관련된 여러 메트릭을 수집하고, 시각화하여 모니터링할 수 있는 환경을 구축한다. 이 글에서는 각각의 컨 hudi.blog
해결법 application.yml # Spring Actuator management: env: enabled: true # /info에 포함할 정보 자유롭게 작성 info: contact: email: support@example.com phone: 000-0000-0000 management.env.enabled = true로 설정해 주면 된다 'Spring in Action 5판'에는 관련된 내용이 없는 것으로 보아 책이 출간된 이후 변경된 내용인 것 같다 출처 Spring Boot - Actuator 공식 문서