스프링 19

회원 가입 API

error code 비밀번호 정책, 가입 요구사항을 만족하기 위한 에러코드를 만든다. @Getter @AllArgsConstructor public enum MemberErrorCode { /** * 회원가입 - 이미 존재하는 이메일, 휴대폰, 닉네임 오류 */ EMAIL_EXIST("이미 가입된 이메일입니다."), PHONE_EXIST("동일한 휴대폰 번호가 존재합니다. 다른 번호를 입력하세요."), NICKNAME_EXIST("동일한 닉네임이 존재합니다. 다른 닉네임을 입력하세요"), /** * 회원가입 - 비밀번호 오류 */ PASSWORD_LENGTH_MORE_THAN_8("비밀번호는 8자리 이상이어야합니다.(영문자, 숫자, 특수문자를 각각 1글자 이상 포함)"), PASSWORD_NOT_CONT..

Chapter 06. Spring Transaction(스프링 트랜잭션)

6.1 트랜잭션(Transaction)이란? Transaction(트랜잭션) 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위를 '트랜잭션'이라고 한다. ex) 오늘의 날씨 데이터를 가져와서 일기 정보를 DB에 저장하기까지의 작업 단위를 트랜잭션이라고 볼 수 있다. 트랜잭션의 속성 원자성(Atomicity) - 트랜잭션이 데이터베이스에 모두 반영되거나 또는 반영되지 않거나 반드시 둘 중 하나여야만 하다. 일관성(Consistency) - 트랜잭션의 작업 처리 결과는 언제나 일관적이어야한다. 독립성(Isolation) - 여러 트랜잭션들이 독립적으로 수행되어야 한다. 지속성(Durablity) - 트랜잭션이 성공적으로 완료된 경우 변화된 상태가 지속적으로 반영되어야한다. 트랜잭션의 연산 - 원자성 ..

Chapter 05. 날씨 데이터 CRUD

5.1 날씨 조회 API 작성 Ex) 조회 - Read repository에 함수 만들기 List findAllByDate(LocalDate date); service public List readDiary(LocalDate date) { return diaryRepository.findAllByDate(date); } Controller - GetMapping @GetMapping("/read/diary") List readDiary(@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date){ return diaryService.readDiary(date); } Note) 실행 결과 - GET send Ex) 날짜 범위를 정..

Chapter 04. 날씨 데이터 저장하기

4.1 openweathermap 데이터 확인 API key란 무엇인가? Aithentication(인증): API를 호출하는 대상을 확인하는 절차를 API 인증이라고 한다. API key 방식 API Token방식 API key: 특정 사용자만 알 수 있는 문자열을 말한다. API 제공처로부터 key를 발급 받도 API 호출 시에 key를 메시지 안에 넣어서 호출한다. openweathermap 서버는 메시지 안에서 key를 읽어서 누가 호출한 API인지 인증한다. API key를 이용해서 날씨 정보 불러오기 https://openweathermap.org/ Сurrent weather and forecast - OpenWeatherMap Access current weather data for any..

Chapter 11. 회원 상세 및 상태 처리

11.1 회원 상세 목록 구현 Ex) 아이디 눌렀을 때 상세 화면으로 이동 - 모자이크 부분은 이메일 Note) 실행 결과 Ex) 상세 페이지 만들기 - detail 관리자 회원 관리 - 회원 상세 정보 관리자 메인 | 회원 관리 | 카테고리 관리 | 강의 관리 | 로그 아웃 - param 에 추가 String userId; - detail 수정 - 모자이크는 이메일 - adminMemberCont 메서드 @GetMapping("/admin/member/detail.do") public String detail(Model model, MemberParam parameter){ parameter.init(); // 유효한 값이 되도록 만든다. return "admin/member/detail"; } Not..

Chapter 09. 관리자 로그인 구현

Ex) 초기 설정 - 먼저, 관리자 페이지를 구성한다. ex)admin,backoffice, cms가 들어간다. http://admin.fastlms.co.kr - 서브 도메인을 따로 둘 수도 있다. http://www.fastlms.co.kr/admin - adminService를 만든다. (member쪽을 만들었듯이) -> AdminMainController package com.zerobase.fastlms.admin; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class AdminMainController { @G..

Chapter 08. 스프링 부트 프로젝트 - 비밀번호 찾기(초기화)

Ex) 메인 페이지에 공통적으로 계속 사용할 코드를 어떻게 관리할까? - ThymeLeaf fragment - layout 파일을 이렇게 구성하면 회원 가입 | 회원 정보 | 로그인 | 로그아웃 - index 파일을 간단히 작성 가능 메인 페이지 - 다른 info, 파일에도 모두 적용한다. - 가입 결과 페이지는 true / false에 맞게 각각 넣어줘야한다. Note) 실행 결과 ==================================오류 ===================================== - 로그인을 해야만 메인페이지가 안 뜬다. - 그리고 메인 기본 인덱스 페이지가 안 나오고 로그인 페이지가 첫 번째로 나온다. - 원인: SecurityConfig클래스에서 메서드 이름을 잘못..

Chapter 07. 스프링 부트 프로젝트 - 로그인/로그아웃

Ex) SecurityConfiguration - demo4 프로젝트 만든다. 종속성 Spring security 선택, pom 파일에서 복사해서 - fastlms에 붙여넣기 -애플리케이션 실행하면 시큐리티 패스워드가 뜬다. - 로컬 접속 - 위의 패스워드 입력해야 로그인이 가능하다. - 시큐리티 Config 클래스 추가, 주소에 대한 권한 설정 -> antMachers: '/' => 루트 페이지, '/**' => 루트 및 모든 페이지 -> 로그인 없이 접속 가능해진다. package com.zerobase.fastlms; import org.springframework.context.annotation.Configuration; import org.springframework.security.confi..

Chapter 08. 빈 생명주기(Bean Life Cycle) 콜백

8.1 빈 생명주기 콜백 시작 빈 생명주기 콜백 시작 데이터베이스 커넥션 풀이나 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리해두고 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다. ex) 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정할 때, 실제로 네트워크에 연결하는것은 아니고 단순히 문자만 출력하도록 했다. 이 'NetworkClient'는 애플리케이션 시작 시점에 'connect()'를 호출해서 연결을 맺어두어야하고 애플리케이션이 종료되면 'disconnect()'를 호출해서 연결을 끊어야한다. 스프링 빈은 '객체 생성' => '의존 관계 주입' 과 같은 라이프 사이클을 사진다. Ex) - NetoworkClient를..

Chapter 05. 싱글톤 컨테이너

5.1 웹 어플리케이션과 싱글톤 웹 애플리케이션과 싱글톤 스프링은 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. 대부분 스프링 애플리케이션은 웹 애플리케이션이다. 웹 애플리케이션은 보통 여러 고객이 동시에 요청한다. 요청이 올 때마다 수많은 객체를 만들 수 있을까? Ex) 스프링 없는 순자 자바 DI 컨테이너 package hello.core.singletone; import hello.core.AppConfig; import hello.core.member.MemberService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; public class SingletonTest { @Test @Display..