목록Spring (38)
Hansel

ModelAttribute ModelAtrribute는 파라미터에 맞는 객체를 받아와서 생성한다. 위 사진의 과정은 다음과 같다. 폼에서 데이터 보냄 ModelAttribute로 객체 생성해서 service로 위임 service에서 업데이트 작업 수행 (Transactional 처리 필수) item객체 내부에서 데이터 변경 JPA에서 변경감지 데이터 수정 POST 이후 새로고침의 문제 ** 포스트를 보낸 직후는 아직 내가 post한 데이터를 그대로 지니고있다. ** ** 브라우저의 새로 고침은 마지막에 서버에 전송한 데이터를 다시 전송한다. ** 상품 등록 폼에서 데이터를 입력하고 저장을 선택하면 POST /add + 상품 데이터를 서버로 전송한다. 이 상태에서 새로 고침을 또 선택하면 마지막에 전송한 ..

타임리프란? 장고의 템플릿 엔진처럼 서버사이드에서 HTML, CSS 등을 동적으로 렌더링 하기 위한 템플릿 엔진이다. html 시작 태그 안에 http://www.thymeleaf.org"> 와 같이 타임리프를 사용하겠다는 명시가 필요하다. 속성 변경 th:href="@{/css/bootstrap.min.css}" href="value1" 을 th:href="value2" 의 값으로 변경한다 타임리프 뷰 템플릿을 거치게 되면 원래 값을 th:xxx 값으로 변경한다. 만약 값이 없다면 새로 생성한다. URL 링크 표현식 th:href="@{/css/bootstrap.min.css}" @{...} : 타임리프는 URL 링크를 사용하는 경우 @{...} 를 사용한다. 속성 변경 : th:onclick oncl..

ModelAttribute 스프링에서 string int integer 같은 단순 타입은 requestParam으로 처리하고 나머지는 modelAttribute로 처리한다. ModelAttribute는 파라미터에 맞게 객체를 생성한다. 요청 파라미터의 이름으로 객체의 프로퍼티를 찾고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다. 예) 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다. HTTP 바디 데이터 가져오기 스프링 MVC는 다음 파라미터를 지원한다. HttpEntity: HTTP header, body 정보를 편리하게 조회 메시지 바디 정보를 직접 조회 HttpEntity는 응답에도 사용 가능 메시지 바디 정보 직..

로그 찍기 운영 시스템에서 soutv로 콘솔을 사용한 로깅은 좋지 않다. 로깅 라이브러리 SLF4J => 다양한 라이브러리를 통합해서 인터페이스로 제공하는 라이브러리 Logback => SLF4J의 구현체 ** Logger 생성시 SLF4J로 선택해야함 ** 로깅을 다양하게 보고싶다면 애플리케이션 yml이나 properties에 logging.level을 설정해준다. trace > debug > info > warn > error 의 우선순위를 가짐 로깅 과정 간소화 LogFactory 쓰기 싫으면 @Slf4j 어노테이션 붙이면 된다. 로깅 주의사항 로그는 반드시 ("level log ={}", @@) 방식으로 사용해야 한다. + 연산을 사용하면 결국 연산이 일어나서 사용하지 않는 로깅 레벨도 연산이 이..

스프링의 MVC 패턴은 모델 뷰 컨트롤러의 패턴을 말한다. 1. MVC 패턴 개념 MVC 패턴은 컨트롤러(Controller)와 뷰(View)라는 영역으로 서로 역할을 나눈 것을 말한다. 컨트롤러: HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다 모델 : 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다. 뷰: 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다. 2. 프론트 컨트롤러 패턴 이 스프링 MVC 패턴에선 프론트 컨트롤러 패턴을 사용한다. 프론트 컨트롤러 서블릿 하나로 클..

메인 화면에는 추천수가 높은 게시글만 몇개 보여주고 나머지 전체 게시글은 따로 보여주는 방식이 나을거같아서 그 방향으로 틀었다. Post의 경우 추천수를 변경해야 하기 때문에 Post 클래스에 해당 로직을 작성했고 Service를 통해 호출하도록 했다. public List findBySuggestion(){ return em.createQuery("select p from Post p order by p.suggestion desc",Post.class) .setFirstResult(0) .setMaxResults(5) .getResultList(); } 컨트롤러의 경우 어떤 글의 추천수가 올라가는지를 알아야 하기 때문에 id를 매개변수로 받아온다. 로직은 매우 간단하다. 몇줄 안된다. 메인화면에선 추..

이번엔 게시글을 작성할 수 있게 해야한다. 게시글을 작성하면서 그 게시글의 유저 또한 현재 로그인한 유저가 될 수 있도록 해줘야 한다. Post 또한 폼을 통한 생성이 필요하기 때문에 PostDto 클래스도 함께 작성한다. 유저를 생성했던 방식과 비슷하게 Post 폼 또한 각 필드의 내용이 PostDto에 담겨 Service의 submit을 호출한다. submit을 해서 바로 post 객체를 persist 하기 전에 게시글의 작성자가 누구인지를 명시해야 한다. 따라서 @AuthenticationPrincipal 을 통해 현재 로그인한 유저의 정보를 가져오는데 해당 어노테이션은 Username, Password, authorities 정도만 가져와서 더욱 더 상세한 유저의 정보가 필요하다면 다른 방법이 필..

앞서 말했듯이 이런식으로 하면 로그인이라 볼 수 없다. 따라서 로그인 기능을 갖출 수 있도록 다시 작성했다. https://hooongs.tistory.com/233 [Spring Boot] 간단한 로그인 기능 구현 - Spring Security Spring Security를 사용하여 간단하게 회원가입과 로그인 및 로그아웃 기능을 구현해보겠습니다. Django에서 auth와 같은 기능과 유사하다고 생각이 들었습니다. 그럼 이제 간단한 설명과 함께 코드를 hooongs.tistory.com 로그인 기능은 위 게시글을 많이 참고했다. Spring Security를 이용하면 정말 간단하게 로그인 기능을 구현할 수 있다. 자세한 내용은 위 티스토리 게시글과 주석을 확인하자. UserDto는 html에서 for..

jpa 기초와 스프링 부트 기초를 공부하고 뭐라도 우선 만들어보고 심화 과정으로 넘어가야겠다는 생각이 들었다. 딱히 아이디어도 없고 그래서 대충 로그인과 글 작성할 수 있는 게시판이나 만들어보자 해서 시작해봤다. 기본적인 도메인은 이런식으로 잡고 이거에 맞춰 만들면 되지 않을까 싶었지만 막상 하다보니 queryDsl과 jpa 심화 과정이 꽤나 절실하게 느껴졌다. 따라서 게시글과 비슷한 매커니즘을 갖는 댓글과 상속 구조를 갖는 카테고리는 생략하기로 했다. 처음엔 user를 이런 식을 짜서 하면 될거라 생각했는데 이러면 로그인 기능이 없다. 그래서 저러한 설계는 다 버리고 로그인 기능을 가질 수 있도록 다시 작성했다. 게시글은 대충 이렇게 잡았다. 작성자와 글 제목, 글 본문, 그리고 추천수와 작성일을 필드..

변경 감지와 병합 두 메서드를 보면 우선 setter를 남발하고 있다. updateItem 메서드 내부의 laptop 객체는 id(pk)가 있으니 리포지토리에서 else문을 타게 될것이다. 그럼 merge를 호출하게 되는데 이것의 문제점이 무엇인지 알아보자. 1. merge(병합) merge 방식은 파라미터로 넘겨 받은 데이터로 기존의 데이터를 바꿔치기 한다. 병합을 사용하면 모든 속성이 변경되기 때문에 병합 시 null이면 기존에 값이 있어도 null로 바뀐다 2. 변경 감지(dirty checking) 엔티티가 영속 상태면 값이 변경 되었을때 commit 시점에 db에 반영한다. one.changeValues() 등의 메서드를 만들어서 setter를 대체해야한다. 결론 변경감지는 원하는 속성만 변경할..