분류 전체보기
[Book] 18) 스프링 Security와 Oauth2.0으로 로그인 기능 구현하기! -1
👻 들어가기 앞서.. 스프링 시큐리티는 인증과 인가 기능을 가진 프레임워크입니다. 인터셉터, 필터 기반의 보안 기능을 구현하는 것보다 스프링 시큐리티를 통해 구현하는 것을 권장한다고 합니다. 확장성을 고려한 프레임워크여서 다양한 요구사항에 쉽게 추가하고 변경할 수 있습니다. 그리고 많은 서비스에서 로그인 기능을 소셜 로그인 기능으로 사용합니다. 왜 소셜 로그인 기능을 사용하나요? 로그인 기능을 직접 구현 하려면 보안, 인증, 찾기, 변경 같은 기능들을 전부 다 구현 해야합니다. 많은 시간 투자와 코드의 복잡성이 늘어나겠죠? 그러나 Oauth 로그인 구현시 로그인 기능을 대신 해주며 서비스 개발에 더욱더 집중 할 수 있도록 합니다. 이번장에서는 구글과 네이버 로그인을 연동하여 로그인 기능을 구현해보겠습니다..
[Book] 17) 수정 및 삭제 기능을 만들어보자!
😀 화면 구성해보기! {{>layout/header}} 게시글 수정 글 번호 제목 작성자 내용 {{posts.content}} 취소 수정 완료 삭제 {{>layout/footer}} 😀 Service 클래스에 수정 / 삭제 기능을 추가해보자! 수정 기능은 앞전에 만들어 놓았습니다. @Transactional public Long update(Long id, PostsUpdateRequestDto requestDto) { Posts entity = getEntity(id); entity.update(requestDto.getTitle(), requestDto.getContent()); return entity.getId(); } service 클래스에 삭제 기능을 추가해봅시다! @Transactional ..
[Book] 16) 전체 조회 화면 및 기능을 만들어보자!
🥢 전체 조회 화면 구성하기! 아래 코드는 앞전에 만든 index.mustache 파일에 있는 코드입니다. 게시글번호 제목 작성자 최종수정일 {{#posts}} {{id}} {{title}} {{author}} {{modifiedDate}} {{/posts}} 😀 Repository 에 전체 조회 기능 만들기!! PostsRepository 에 기능을 추가해봅시다. @Query("select p from Posts p order by p.id desc") List findAllDesc(); List 타입으로 Posts의 모든 데이터를 내림차순으로 받아옵니다. spring data jpa 의 기능으로 메서드 만으로 위와 같은 기능을 만들 수 있습니다. List** findAllByOrderByIdDesc*..
[Book] 15) 머스테치로 화면 구성을 해보자! -2
👻 인덱스 페이지 만들기! {{>layout/header}} Main Page 글 등록 {{#userName}} Logged in as:{{userName}} Logout {{/userName}} {{^userName}} Google Login Naver Login {{/userName}} 게시글번호 제목 작성자 최종수정일 {{#posts}} {{id}} {{title}} {{author}} {{modifiedDate}} {{/posts}} {{>layout/footer}} 👻 레이아웃 분리해보자! footer.mustahce header.mustache 👻 posts-save 페이지를 만들어보자! {{>layout/header}} 게시글 등록 제목 작성자 내용 취소 등록 {{>layout/footer}..
[Book] 14) 머스테치로 화면 구성을 해보자! -1
👻 머스테치 플러그인 설치! plugin 설정에 들어가서 handlebars/mustache 를 설치해 줍니다. 👻 머스테치 의존성 추가! build.gradle 파일에 implementation 'org.springframework.boot:spring-boot-starter-mustache' 의존성을 추가해 줍니다. 🕶 index 페이지를 만들어보자!. resources 파일의 templates 안에 index.mustache 파일을 생성해줍니다. 스프링 🕶 index 파일을 제어 하는 Controller 를 만들어야합니다. @Controller public class IndexController{ @GetMapping("/") public String index() { return "index"; ..
[Book] 13) JPA Auditing으로 생성시간/수정시간 자동화 하기!
👻 시간 엔티티 만들기! 매번 DB 에 생성시간과 수정시간을 삽입 하고 갱신 하는 것은 번거로운 일 입니다. 자동으로 생성시간과 수정시간을 관리해주는 JPA Auditing 을 사용합니다. 자 그러면 domain 패키지에 BaseTimeEntity 를 생성해봅시다. @Getter @MappedSuperclass // 해당 엔티티를 상속한 엔티티의 속성 값도 엔티티에 적용 @EntityListeners(AuditingEntityListener.class)// Auditing 기능을 적용 public class BaseTimeEntity { @CreatedDate // 엔티티가 생성되어 저장될 때 시간이 자동 저장 private LocalDateTime createdTime; @LastModifiedDate..
[Book] 12) H2 DB 웹 콘솔에서 직접 접근해보자!
👻 h2 db 웹 콘솔에서 직접 접근 하기! 지금까지 h2 db를 메모리에서 관리를 하였습니다. 지금은 db를 웹 콘솔에 직접 접근하여 관리를 해보겠습니다. application.properties 파일에 spring.h2.console.enabled=true 을 추가 해줍시다!. http://localhost:8080/h2-console 를 접속합니다. jdbc url 을 jdbc:h2:mem:testdb 으로 지정 해줍니다. 다음으로 concat 버튼을 눌러 접속 해줍니다. 접속한 db에 console 창에 select * from posts; 입력하여 db를 확인합니다.
[CS] 교착상태(DeadLock) 기아상태(Starvation)
🤢 프로세스의 자원 이용 순서 요청 → 프로세스가 필요한 자원을 요청하고 요청이 즉시 받아들이지 않으면 다른 프로세스가 사용 중 이므로 할당 받을 때까지 대기를 합니다. 사용 → 프로세스가 요청한 자원을 사용합니다. 해제 → 프로세스가 자원 사용을 마친 후, 할당 받은 자원을 되돌려 줍니다. 👻 교착상태 (DeadLock) 이 무엇인가요? 교착상태란 한 프로세스 집합에서 발생할 Event 를 프로세스들이 서로 기다리고 있는 상태를 말합니다. 👻 교착상태가 왜 발생을 되나요? 작업이 보류 상태에 놓이고 중요한 자원을 이용하기 위해 기다릴 떄 발생되고 제한된 자원 이용률을 높이고 시스템 효율성을 증가시키기 위해 사용하는 병행 처리 기술과 자원 공유에 따른 부작용입니다. 아래의 4가지 발생 조건을 확인 해 봅..
[Book] 11) API 만들어보기! -4
🕶 업데이트 기능을 만들어 봅시다!. Controller 클래스에 기능 추가해보기! @PutMapping("/api/v1/posts/{id}") -> http put() 사용합니다. public Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto) { return postsService.update(id, requestDto); } updateRequestDto 클래스를 활용하여 업데이트 할 데이터를 담아서 엔티티에 전달하게 합니다. updateRequestDto 클래스 생성해보기! @Getter @NoArgsConstructor public class PostsUpdateRequestDto{ private St..
[Book] 10) API 만들어보기! -3
👻 Repository 에 저장된 값을 조회하는 기능을 만들어보자! controller 클래스에 findById() 기능을 추가해봅시다. @GetMapping("/api/v1/posts/{id}") -> http get() 사용 public PostsResponseDto findById(@PathVariable Long id) { -> uri 에 있는 변수값을 설정 return postsService.findById(id); } 다음으로는 응답을 받아주는 ResponseDto 클래스를 생성해 봅시다. @Getter public class PostsResponseDto { private final Long id; // id private final String title; // 제목 private fina..
[Book] 9) API 만들어보기! - 2
👻 저장 API를 만들어 봅시다!. RestController 를 생성하여 save() 라는 기능을 만들어 봅시다. 현재 조립해야 할 클래스들은 PostsService 클래스와 PostsSaveRequestDto 클래스 2가지가 있습니다. 이 2가지도 같이 생성하겠습니다. @RequiredArgsConstructor -> final 필드의 생성자를 만들어줍니다. @RestController -> @ResponseBody + @Controller 인 기능입니다. public class PostsApiController { private final PostsService postsService; @PostMapping("/api/v1/posts") -> http 메서드의 Post 메서드를 사용합니다. pub..
[Book] 8) API 만들어보기! - 1
👻 들어가기 앞서.. API 를 만들기 전에 총 3개의 클래스들이 필요 합니다. Request 데이터를 받을 Dto API 요청을 받을 Controller 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service Service에서 비지니스 로직을 처리 해야하는 오해가 있는데 Service 클래스는 트랜잭션, 도메인 간 순서 보장의 역할만 합니다. 그럼 비지니스 로직은 누가 처리하나요?? 도메인 클래스에서 비지니스 로직을 처리합니다. 다음 layer 그림을 봅시다. Web Layer 컨트롤러(@Controller) 와 뷰 템플릿 영역 입니다. 이외에도 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice) 등 외부 요청과 응답에 대한 전반적인 영역 입니다. Service ..
[Book] 7) 출력되는 쿼리문을 MySQL 문법으로 수정 후 이슈
application.properties 파일을 생성하여 아래와 같은 코드를 작성하고 실행을 하였습니다. ## jpa spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 아래 사진과 같은 오류가 나타납니다. 시도 [x] properties 파일을 삭제하고 다시 생성하여 실행 [x] spring.jpa.hibernate.ddl-auto=create 또는 update 구문 추가 implementation 'com.h2database:h2:1.4.199' 버전 수정하여 해결 기존의 스프링 부트 버전이 2.6.5 의 최신 버전이었습니다. 최신 버전이 h2 db 와 호환이 잘..
[Book] 6) JPA 로 데이터베이스를 다루어보자!
🕶 들어가기 앞서... 웹 개발을 운영시에 데이터베이스를 다루는 일이 많습니다. 기능 개발을 하여도 데이터베이스와 연동하는 것을 피할 수 없습니다. 자바에서는 객체지향 프로그래밍을 지향하고 있고 데이터베이스는 관계형 데이터베이스를 지향하고 있습니다. 이둘의 차이를 극복하게 해주는 기술이 바로 JPA 라는 자바 표준 ORM 기술입니다. JPA 라는 자바 표준 ORM 은 자바에서의 객체의 멤버들을 데이터베이스와 매핑(Mapping) 을 시켜주어 간단하게 관계를 맷어줄 수 있고 자바와 데이터베이스의 패러다임 불일치 문제, 즉 객체지향 프로그래밍과 관계형 데이터베이스의 관계 불일치 문제점을 해결 해주는 기술입니다. 🕶 JPA를 사용시 좋은점.. 자바 개발을 할 때 객체지향 프로그래밍을 할 수 있게 도와주고 JP..
[스프링 웹 MVC 동작 원리] Dispatcher Servlet 동작 원리
👻 Dispatcher Servlet 동작 원리를 알아보자! Client에서 요청을 보내고 Dispatcher Servlet 이 요청을 분석하여 핸들러 매핑이 요청에 맞는 핸들러를 찾아줍니다. 찾은 핸들러를 실행할 수 있는 어뎁터를 찾습니다. 찾은 핸들러 어뎁터가 핸들러를 실행해주는 과정에서 핸들러의 리턴 값에 따라 처리 결과를 Dispatcher Servlet 에 읍답을 내리고 ViewResolber 를 호출하고 view 이름에 해당되면 view 를 찾아 출력해주고 응답을 내립니다. 예외 처리가 필요할 시 HandlerExceptionResolver 가 처리 하고 최종적으로 응답을 내보냅니다. 동작 원리를 그림으로 보면서 이해해 봅시다!. 참조 그림