본문 바로가기

728x90

백엔드

[Spring Boot] 순환 참조 (Circular Reference) /* 순환 참조 */ 순환 참조 (Circular Reference) 란 서로 다른 Bean들이 서로를 참조하고 있어서 서로가 서로에게 의존하는 구조를 말한다. 이는 스프링 컨테이너가 빈의 생명주기를 관리하는 과정에서 문제를 일으킬 수 있습니다. 스프링의 특징인 IOC/DI , AOP, PSA 중 하나인 IOC/DI와 연관있는 만큼 주의할 필요가 있다. 순환 참조 에러 메시지: *************************** APPLICATION FAILED TO START *************************** Description: The dependencies of some of the beans in the application context form a cycle: ┌─────┐ |.. 더보기
[Java] 리액티브 프로그래밍 - RxJava /* 리액티브 프로그래밍 */ 리액티브 프로그래밍 (Reactive Programming)은 비동기 데이터 스트림을 기반으로하는 프로그래밍 패러다임입니다. 데이터 스트림을 관찰하고, 데이터가 변할 때마다 이에 맞는 동작을 수행하도록 설계된다. 이는 비동기 작업에 효율적이다 데이터 스트림: 데이터 스트림은 시간에 따라 발생하는 연속적인 데이터 항목들의 시퀀스다. ex) 사용자 입력 이벤트 (사용자가 마우스를 클릭하거나 키보드를 누를 때마다 발생하는 이벤트), 네트워크 요청 (서버에서 데이터를 요청할 때 수신받는 응답 데이터 - 주식 데이터), 파일 I/O (대용량 파일을 읽어서 처리하는 경우, 파일의 각 부분을 순차적으로 읽어들이는 과정) 리액티브 프로그래밍은 자원을 효육적으로 사용하고, 더 많은 사용자들.. 더보기
[Docker] 도커란 무엇인가 /* 도커를 쓰는 이유 */ 처음에 도커라는 개념이 너무 이해가 안됐다. 도커를 쓰는 이유에 대해 알면 개념을 잡는 데 도움이 많이 될 것이다. 먼저, 공동프로젝트로 웹 개발을 한다고 생각해보자. 프론트 개발자 1명, 백엔드 개발자 1명이다. 프론트는 자바스크립트를 쓰고 백엔드는 자바를 쓴다. 어느날, 두 명은 프론트, 백엔드를 같이 돌려서 서로 통신이 잘 되는 지 테스트를 해보고 싶다고 한다. 하지만, 프론트의 컴퓨터에는 자바가 깔려있지 않고, 백엔드의 컴퓨터에는 자바 스크립트가 깔려있지 않다. 그러면 테스트를 위해서는 프론트는 자바를 다운로드 해야하고 백엔드는 자바 스크립트를 다운로드 해야한다. 거기서 더해서 백엔드는 nodejs를 다운로드 해야하고 프론트엔드는 MySQL을 다운로드 할 필요도 있다,.. 더보기
[Spring Boot] RESTAPI - 예외처리 /* 특수 예외처리 (유저 찾기 실패 시)*/ @GetMapping("/users/{id}") public EntityModel retrieveUser(@PathVariable int id) { User user = userDaoService.findById(id); if (user == null) { throw new UserNotFoundException("id:" + id); } EntityModel entityModel = EntityModel.of(user); WebMvcLinkBuilder link = linkTo(methodOn(this.getClass()).retrieveUserList()); entityModel.add(link.withRel("all-users")); return ent.. 더보기
[Spring Boot] JsonIgnore, JsonIgnoreProperty, JsonFilter /* 사용 이유 */ 클라이언트에게 보내면 위험한 데이터가 있다. 따라서 @JsonIgnore, @JsonIgnoreProperties 아니면 @JsonFilter를 이용해 클라이언트에 데이터를 보낼 시 필터링 작업을 거칠 수 있다. /* 방법 1. @JsonIgnore - field2 가리기*/ public class SomeBean{ private String field1; @JsonIgnore private String field2; private String field3; public SomeBean(String field1, String field2, String field3){ this.field1 = field1; this.field2 = field2; this.field3 = field3;.. 더보기
[Spring Boot] RestAPI - ResponseEntity, Hateoas /*REST API*/ REST (Representational State Transfer) API : 웹 서비스에서 클라이언트와 서버간의 통신을 위한 아키텍처 스타일. /*ResponseEntity - 빌더사용*/ HTTP 요청에 대한 응답을 캡슐화하는 클래스. HTTP 상태 코드, 헤더, 바디 를 포함할 수 있다. Builder를 사용하는 게 직관적이어서 더 좋다고 생각한다. @GetMapping("/test") public ResponseEntity test(){ HttpHeaders headers = new HttpHeaders(); headers.add("HeaderName","HeaderValue"); return ResponseEntity.ok() //상태코드 .headers(headers).. 더보기
[Spring Boot] 메시지 국제화 (Internationalization) /* 메시지 국제화 */ 내가 만들고 있는 웹이 여러 언어 환경을 지원할 수 있도록 설계하는 것을 의미한다. (독일에 있는 독일인이 내 웹을 보고싶다 -> 자동으로 독일어를 지원하게 하는 웹) /* 디폴트값 설정 */ 나는 REST API로 메시지 국제화를 해볼 생각이다. 그래서 localhost:8080/hello-world-internationaized 를 방문했을 때 Good Morning 을 디폴트 값으로 설정하고 독일어를 지원할 생각이다. 그러면 디폴트값은 다음과 같이 설정할 수 있다. // messages.properties good.morning.message = Good Morning 파일명은 반드시 messages.properties로 해야한다. yml파일은 안된다 (혹시 되나요?) /*.. 더보기
[Spring Boot] @Validation 유효성 /* Validation */ implementation 'org.springframework.boot:spring-boot-starter-validation' 위는 gradle 용 dependency로 validation dependency를 이용할 수 있다. /* 객체 설정*/ @Getter @Setter @Entity public class Todo { @NotNull private int id; @NotBlank(message = "유저명은 필수 입력 값입니다") private String userName; @Size(min = 10, message = "열글자 이상 입력하세요") private String description; private LocalDate localDate; private .. 더보기

728x90