Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
## 📌 몇 주차 워크북인가요?
- 예: Week01

---

## ✨ 이번 주에 작업한 내용
- 구현/수정한 기능 요약
- 예: 회원가입 API 구현
- 예: UI 레이아웃 정리

---

## 🙋 리뷰 요청/확인 받고 싶은 부분
- 예: 비밀번호 유효성 검사 로직이 적절한지 확인 부탁드립니다.
- 예: Controller 단의 코드 구조 피드백 원합니다.

---

## ✅ 체크리스트
- [ ] `weekN/` 폴더 안에 과제 정리 완료
- [ ] PR 생성 시 **base = 조직 내 본인 브랜치**, **compare = 내 Fork main 브랜치**로 설정했는지 확인
- [ ] PR 제목에 **`[WeekN] 닉네임/이름 미션 제출`** 규칙 맞게 작성
40 changes: 40 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# 🌱 9th-Springboot
> 9th 서경대 **UMC Springboot 파트 Repository** 입니다.

<p>
<img src="https://img.shields.io/badge/UMC-9th-6A5ACD?style=for-the-badge&logo=github&logoColor=white" />
<img src="https://img.shields.io/badge/Repository-Springboot%20Part-6DB33F?style=for-the-badge" />
</p>

<br>

## 🚀 GitHub 미션 제출 방법
1. 본인의 닉네임으로 새 브랜치를 만들어 주세요.
2. 이 레포지토리를 본인 계정으로 Fork 합니다.
3. Fork한 레포지토리에 미션 결과물을 올립니다.
4. 본인 레포지토리에서 SKU-UMC 레포지토리의 닉네임 브랜치로 Pull Request(PR)를 보내면 끝!
- [SKU UMC GitHub 미션 제출 가이드](https://acoustic-daffodil-00e.notion.site/GitHub-26731d49a1348042878ff024dcbde258)

<br>

## 🍀 PR 규칙
- **제목 형식**
- [WeekN] 닉네임/이름 미션 제출
- ex) `[Week01] 프롬/전다인 미션 제출`

- **주의사항**
- main 브랜치로는 절대 PR ❌
- 반드시 fork된 본인 레포 → original 레포 본인 브랜치로 PR 보내기 ✅

- **리뷰 & 머지**
- 파트장이 PR 내용을 확인 후 피드백을 남깁니다.
- 필요 시 수정/보완을 진행한 뒤 다시 확인을 받습니다.
- 최종적으로 확인되면 approve 후 머지합니다.

<br>

## 📢 안내사항
- PR 기준으로 워크북 수행 여부를 체크합니다.
→ 모든 미션을 완료하지 못했더라도 진행한 만큼 제출 부탁드립니다!
- 리뷰는 단순한 평가가 아니라 함께 배우는 과정이니, 피드백을 참고해 부족했던 부분을 채워가면 됩니다.
- 모르는 부분이 있으면 언제든 운영진에게 질문해 주세요!
10 changes: 10 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,16 @@ dependencies {

// Validation
implementation 'org.springframework.boot:spring-boot-starter-validation'

// Security
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.security:spring-security-test'

// Jwt
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'
implementation 'org.springframework.boot:spring-boot-configuration-processor'
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.example.umc_9th_springboot.domain.user.controller;

import com.example.umc_9th_springboot.domain.user.dto.req.UserReqDTO;
import com.example.umc_9th_springboot.domain.user.dto.res.UserResDTO;
import com.example.umc_9th_springboot.domain.user.service.UserCommandService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {

private final UserCommandService userCommandService;

//회원가입 세션 API
@PostMapping("/sign-up/session")
public UserResDTO.SignUpDTO signUp(@RequestBody UserReqDTO.SignUpDTO request) {
return userCommandService.signup(request);
}

// 로그인 세션 API
@PostMapping("/login/session")
public UserResDTO.LoginSessionDTO loginSession(
@RequestBody UserReqDTO.LoginSessionDTO request,
HttpServletRequest httpRequest
) {
UserResDTO.LoginSessionDTO response = userCommandService.login(request);

// 세션 생성 및 사용자 정보 저장
HttpSession session = httpRequest.getSession(true);
session.setAttribute("loginUserId", response.getUserId());
session.setAttribute("loginUserEmail", response.getEmail());

return response;
}
// 로그아웃 세션 방식
@PostMapping("/logout/session")
public void logoutSession(HttpServletRequest httpRequest) {
HttpSession session = httpRequest.getSession(false);
if (session != null) {
session.invalidate();
}
}

// 로그인 JWT 방식 API
@PostMapping("/login/jwt")
public UserResDTO.LoginJwtDTO loginJwt(
@RequestBody UserReqDTO.LoginJwtDTO request
) {
return userCommandService.loginJwt(request);
}

// jwt 회원가입 API
@PostMapping("/sign-up/jwt")
public UserResDTO.SignUpJwtDTO signUpJwt(@RequestBody UserReqDTO.SignUpDTO request) {
return userCommandService.signupJwt(request);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.example.umc_9th_springboot.domain.user.converter;

import com.example.umc_9th_springboot.domain.user.dto.req.UserReqDTO;
import com.example.umc_9th_springboot.domain.user.entity.User;
import com.example.umc_9th_springboot.global.auth.enums.Role;

import java.time.LocalDate;

public class UserConverter {
public static User toUser(
UserReqDTO.SignUpDTO request,
String encodedPassword,
Role role
) {
return User.builder()
.email(request.getEmail())
.password(encodedPassword)
.name(request.getName())
.gender(request.getGender())
.birth(LocalDate.parse(request.getBirth()))
.address(request.getAddress())
.role(role)
.point(0)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.example.umc_9th_springboot.domain.user.dto.req;

import com.example.umc_9th_springboot.domain.user.enums.Gender;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;

public class UserReqDTO {

//회원가입 세션 방식 요청 DTO
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class SignUpDTO {
private String email;
private String password;
private String name;
private Gender gender;
private String birth;
private String address;
}

//로그인 세션 방식 요청 DTO
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class LoginSessionDTO {
private String email;
private String password;
}

// 로그인 jwt 방식 요청 DTO
public record LoginJwtDTO(
@NotBlank
String email,
@NotBlank
String password
) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.example.umc_9th_springboot.domain.user.dto.res;
import com.example.umc_9th_springboot.global.auth.enums.Role;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

public class UserResDTO {

//회원가입 세션 방식 응답 DTO
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class SignUpDTO {
private Long userId;
private String email;
private String name;
private Role role;
}

//로그인 세션 방식 응답 DTO
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class LoginSessionDTO {
private Long userId;
private String email;
private String name;
private Role role;
}

// 로그인 jwt 방식 응답 DTO
@Builder
public record LoginJwtDTO(
Long userId,
String accessToken
) {}

// jwt 회원가입 응답 DTO
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class SignUpJwtDTO {
private Long userId;
private String email;
private String name;
private Role role;
private String accessToken;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.example.umc_9th_springboot.domain.shop.entity.UserRegion;
import com.example.umc_9th_springboot.domain.review.entity.Review;
import com.example.umc_9th_springboot.domain.review.entity.ReviewComment;
import com.example.umc_9th_springboot.global.auth.enums.Role;
import jakarta.persistence.*;
import lombok.*;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
Expand All @@ -31,6 +32,15 @@ public class User extends BaseEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false, unique = true)
private String email;

@Column(nullable = false)
private String password;

@Enumerated(EnumType.STRING)
private Role role;

@Column(nullable = false, length = 20)
private String name;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@

public interface UserRepository extends JpaRepository<User, Long> {

// 이메일로 조회
Optional<User> findByEmail(String email);

//마이페이지 회원 정보 조회
Optional<User> findById(Long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.umc_9th_springboot.domain.user.service;

import com.example.umc_9th_springboot.domain.user.dto.req.UserReqDTO;
import com.example.umc_9th_springboot.domain.user.dto.res.UserResDTO;

public interface UserCommandService {

// Session 회원가입
UserResDTO.SignUpDTO signup(UserReqDTO.SignUpDTO dto);
// Session 로그인
UserResDTO.LoginSessionDTO login(UserReqDTO.LoginSessionDTO dto);

// jwt 로그인
UserResDTO.LoginJwtDTO loginJwt(UserReqDTO.LoginJwtDTO dto);

// jwt 회원가입
UserResDTO.SignUpJwtDTO signupJwt(UserReqDTO.SignUpDTO dto);
}
Loading