스프링 프레임워크는 3가지 특징인 IoC/DI, PSA, AOP 가 있는데, 그 중 AOP 에 대해 알아보자 AOP AOP는 Aspect Orient Programming (관점 지향 프로그래밍) 으로, 어떤 로직을 핵심 기능과 부가 기능으로 나누고, 이를 각각 모듈화를 하는 프로그래밍이다. 핵심 기능은 핵심 비즈니스 로직이고, 부가 기능으로는 핵심 로직을 수행하기 위해 공통적으로 필요한 기능들, 예를 들면 로깅, DB연결, 등이 있다. 만약 특정 유저의 요청과 응답 사이의 시간을 기록하고 싶다면 AOP를 적용하지 않는다면 다음과 같이 해야 할 것이다. @PostMapping("/products") public ProductResponseDto createProduct(@RequestBody Produc..
전체 글
안녕하세요. PS풀이, 개발일지 및 일기, 소소한 이야기를 적어가는 윤재 입니다.심화 과제로 테스트 코드 작성을 했었는데 처음 하는 거다 보니 어떻게 적어야 할지 몰라서 조금 헤맸다. 정답이 딱 정해진 게 아니다 보니 구글링으로 레퍼런스로 찾기도 힘들어서 더 그랬다. 그래서 해설 강의와 레포를 보면서 다시 개선해보고 있다. 그중 하나로 컨트롤러 테스트마다 @WebMvcTest를 달아주어 매 컨트롤러마다 스프링을 실행하던 것을 부모 클래스로 추상화하여 상속을 받도록 했다. 사실 이건 ㅊㅈㅇ님께서 알려준 내용이지만. @ActiveProfiles("test") @MockBean(JpaMetamodelMappingContext.class) @WebMvcTest( controllers = { AuthController.class, TodoController.class, CommentContr..
문제 테스트 코드를 작성할 때, 로그인 및 회원가입에 쓰이는 AuthRequestDto 는 username과 password를 필드로 가지고 있고, validation 라이브러리로 검증하도록 했다. 하지만 컨트롤러에서 @Valid 로 검증하는 탓에, 테스트에서 직접 값을 넣으면 아무 예외도 발생하지 않는 문제가 있었다. @DisplayName("유효하지 않은 username 및 password 요청") @Test void validate_invalid_username() { // given String username = "us"; String password = "1234"; // when & then assertThrows(MethodArgumentNotValidException.class, () -..
오늘 목표 숙련 주차를 페이징만 듣고 심화로 넘어갈랬는데 숙련을 들어야 심화를 들을 수 있어서 후딱 듣고 심화로 넘어갔다. 오늘 다 들어버리려고 했는데 노는 게 젤 좋아서,, 4시간 분량 중 1시간 반 남았다. 근데 50분어치는 아는 거라서 2배속으로 들을 듯. 낼 다 듣고 과제해야지. 캐스케이드란 ? 엔티티의 상태 변화를 전파시키는 옵션이다. @OneToMany 나 @ManyToOne에 줄 수 있는 옵션이다. @Entity @Getter @Setter @Table(name = "food") public class Food { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; privat..
오늘 목표 숙련주차 완강 -> 다 못 들었고, 다 들을 필요 없을 것 같아서 페이징까지만 봤고, 낼부터 심화 강의로 넘어갈 예정 문제 이번에 뉴스피드 프로젝트를 할 때, 스프링 시큐리티로 인증 후 @AuthenticationPrincipal로 가져온 UserDetails 안에 있는 User 엔티티를 이용해서, 패스워드를 변경하는 API를 만들고 있었다. 근데 update 쿼리가 안 나간다!! 이게 뭐여 하면서 일단은 서비스단에서 User의 nickname을 이용해서 다시 레포지토리에서 가져오는 식으로 해결을 했었다. 오늘 마침 여유도 있겠다 그 부분을 해결해 봤다. 아, 이게 트러블 슈팅이네 일단 에러가 났던 코드는 밑과 같다. @PatchMapping("/api/users/password") publi..
RestTemplate Get 요청 방법 private final RestTemplate restTemplate; // RestTemplateBuilder의 build()를 사용하여 RestTemplate을 생성합니다. public RestTemplateService(RestTemplateBuilder builder) { this.restTemplate = builder.build(); } 레스트 템플릿을 매개변수로 받는 것이 아니라, 빌더를 받아서 빌드해줘야 한다!! public ItemDto getCallObject(String query) { // 요청 URL 만들기 URI uri = UriComponentsBuilder .fromUriString("http://localhost:7070") .pa..
B-12조 팀 아이뽀 : 김재윤, 길경남, 이준영, 유민아 팀원 모두 의논하여 한번에 작성했습니다. Keep 기획 및 설계가 꼼꼼하게 잘 되어 있음 컨벤션 및 전략을 명확히 정하고 잘 따라서 효율성 높음 중간중간마다 소통도 잘 되고 업무 분담이 잘 되어 충돌이 최소화됨 Problem 기능을 구현함에 있어 절대적 시간이 부족했다. 팀원 간의 충분히 고민할 시간을 주지 않고 팀장이 해결 Try 더 어려운 기능 구현해보기 배포 해보기 테스트 코드 작성 해보기
문제 시큐리티에서 UserDetails 를 가져와서, 비밀번호를 수정하는 API를 만들고 있었다. 근데 업데이트 SQL문이 나가질 않는다.. 문제의 코드다. @PatchMapping("/password") public ResponseEntity updatePassword( @AuthenticationPrincipal UserDetailsImpl userDetails, @Valid @RequestBody UserPasswordUpdateRequestDto requestDto) { userService.updatePassword(userDetails.getUser(), requestDto); return ResponseEntity.ok().build(); } /** * 비밀번호 수정 */ @Transacti..
문제1 MySQL 자료형 중 datetime(6) 과 같이 괄호 속 숫자는 무엇일까 이번 뉴스피드 프로젝트에서 JPA로 엔티티를 만들던 중 JPA가 만들어준 SQL문을 보고 있었다. Hibernate: create table users ( created_at datetime(6), id bigint not null auto_increment, modified_at datetime(6), login_id varchar(20) not null, nickname varchar(20) not null, description varchar(40), password varchar(60) not null, primary key (id) ) engine=InnoDB Hibernate: alter table users ..