목록분류 전체보기 (718)
쌓고 쌓다
먼저 상황은 이랬다. 사용자는 중복된 값(여행지)을 선택할 수 있다. 선택한 값 리스트중 원하는 요소(여행지)를 삭제할 수 있어야한다. 중복된 값을 선택할 수 있기에 현재 삭제를 원하는 요소를 가지고 현재 선택된 요소들을 돌며 비교 연산으로 삭제하면 먼저 만나는 값을 삭제해버리는 상황이다. 딱 원하는 순서의 요소를 삭제할 수 있어야하는게 원하는 기능이다. let selectPlaces = []; // 선택된 여행지 여행지는 리스트에 보관하고 있으며 추가와 삭제가 자유로워야하고 삭제한 순번에 맞춰 리스트의 인덱스 값도 삭제해야하는 상황이다. 먼저 여행지 추가시 보이는 화면의 HTML에 추가하고 선택된 여행지 리스트에 담아주는 코드이다. function addPlace(addPlace) { selectPla..
현재 게시글 등록과 수정시 전달하는 폼 데이터가 동일하다. 하지만. 폼에서 전달하는 데이터가 실무에서는 차이가 있다. 등록시에는 약관과 같은 추가적인 정보를 받을 수 있으며, 등록시와 다르게 수정시 다른 BeanValidation을 적용할 수도 있다. (EX. 게시글 수정시 내용은 없어도 괜찮음) 그래서 폼 데이터와 동일한 데이터를 전달 받을 별도의 객체를 만들어서 받는것이 좋다. 전달 받은 별도의 객체의 데이터를 통해 컨트롤러에서 게시글 객체를 생성하자. 원래의 폼 데이터 처리 방식과 비교해서 생각해보면 게시글 객체를 또 다시 만드는 이유를 알 수 있다. 기존 방식 - 도메인 객체 그대로 사용 HTML Form -> Poster -> Controller -> Poster -> Repository Pos..
풀이 방법 그래프 탐색보단 storey를 0으로 만드는 방법을 찾으면 된다. (1) 일의 자리가 4이하라면 - 연산으로 빼버리는게 최소의 연산으로 0에 가깝게 만들 수 있고. (2) 일의 자리가 6이상이라면 + 연산으로 10을 만들어 -10 연산을 하는게 최소의 연산이 된다. EX) 6이라면 6에서 + 연산으로 10을 만들고 -10 연산을하면 5번의 연산이 필요하다. 그러나 6에서 - 연산으로 0을 만들자면 -1 연산을 6번이 필요하다. 즉 6이상이면 +연산을 해버리는게 최소의 연산이다. (3) 일의 자리가 5라면 5를 0으로 만드나, 5를 10으로 만드나 5번의 연산이 똑같이 필요한데 다음 자리 수를 보고 더 이득이 되는 방향을 잡을 수 있다. 다음 자리 수가 5~9면 일의 자리수를 올림해버리는게 연산..
먼저 Bean Validation 사용을 위해 클래스에 어노테이션을 사용했다. @Data public class Item { private Long id; @NotBlank(message = "공백X") private String itemName; @NotNull @Range(min=1000, max=100000) private Integer price; @NotNull @Max(99) private Integer quantity; } 오류 코드는 붙은 어노테이션의 이름을 그대로 따라간다. 예를들어 @NotBlank에서 오류가 발생했다면 NotBlank라는 오류 코드로 다양한 메시지를 생성해낸다. 이때 메시지 생성은 MessageCodesResolver를 통해 생성해낸다. NotBlank로 생성된 메시지..
SessionConst package com.example.demo.session; public class SessionConst { public static final String LOGIN_MEMBER = "loginMember"; } HttpSession에 데이터를 보관하고 조회할 때, 자주 사용되므로 상수를 정의하여 사용할 수 있다. 신규 세션 등록 @GetMapping("kakao/test") public String kakaoOauth(HttpServletRequest request) { //로그인 후. Member 반환 Member member = kaKaoUser.login(token.get("access_token")); HttpSession session = request.getSess..
application.properties - jpa가 날리는 sql 보기 spring.jpa.show-sql=true 코드를 작성했는데 이상하게 SELECT 문이 나가는것이다... memberRepository.save(member); save시 INSERT 쿼리가 날라가고 SELECT 쿼리가 날라가는 것이다. 왜일까? save 메서드는 이미 존재하는 식별자 값이라면 이미 있는 엔티티로 판단해 merge를 한다. 만약 없는 식별자 값이라면 새로운 엔티티로 persist를 한다. 즉, 이미 존재하는 식별자 값이면. 변경 사항이 있다면 UPDATE하고 존재하지 않는 식별자 값이라면 INSERT한다. 한번 진짜 존재하는 엔티티 식별자가 있으면 UPDATE를 날리는지 보자. 현재 DB에 값이 존재한다. 이때 똑..
문제의 코드를 보자. Member findMember = memberRepository.findById(member.getId()).get(); if(findMember==null) { ... } Repository에서 ID를 통해 회원을 찾아 get으로 객체를 꺼내 없으면 if문을 통해 로직을 수행하게하려 했으나... 위의 에러가 발생했다. Optional에서 get으로 꺼낼때 안에 객체가 존재하지 않으면 Exception을 터트린다. 해결 방법 Member findMember = memberRepository.findById(member.getId()).orElse(null); orElse를 통해 값이 있다면 그 값을 반환하고 없다면 null을 반환하도록 했다.
BeanValidation으로 검증 코드를 작성하지 않고 어노테이션 하나로 검증 로직을 편리하게 적용할 수 있다. 의존 관계 추가 implementation 'org.springframework.boot:spring-boot-starter-validation' Poster 클래스 @Entity @Getter @Setter @ToString public class Poster { @NotBlank private String title; @NotBlank private String writer; @NotBlank private String content; private LocalDateTime regdate; @NotNull @Range(min = 100, max = 250) private Long heig..