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
15 changes: 14 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,26 @@ dependencies {
compileOnly 'org.projectlombok:lombok:1.18.22'
annotationProcessor 'org.projectlombok:lombok:1.18.22'


testImplementation 'org.springframework.boot:spring-boot-starter-test'

// 에러 핸들러를 만들기 위해 validation과 관련된 기능을 사용하기 위한 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-validation'

// Swagger 세팅
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'


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

//Thymeleaf 추가
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE'

implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

}

sourceSets {
Expand Down Expand Up @@ -88,4 +101,4 @@ configurations {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
}
}
4 changes: 4 additions & 0 deletions src/main/generated/umc/spring/domain/QMember.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,14 @@ public class QMember extends EntityPathBase<Member> {

public final StringPath name = createString("name");

public final StringPath password = createString("password");

public final NumberPath<Integer> point = createNumber("point", Integer.class);

public final ListPath<Review, QReview> reviewList = this.<Review, QReview>createList("reviewList", Review.class, QReview.class, PathInits.DIRECT2);

public final EnumPath<umc.spring.domain.enums.Role> role = createEnum("role", umc.spring.domain.enums.Role.class);

public final EnumPath<umc.spring.domain.enums.SocialType> socialType = createEnum("socialType", umc.spring.domain.enums.SocialType.class);

public final StringPath specAddress = createString("specAddress");
Expand Down
38 changes: 20 additions & 18 deletions src/main/java/umc/spring/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import umc.spring.service.StoreService.StoreQueryService;


@SpringBootApplication
@EnableJpaAuditing
public class Application {
Expand All @@ -16,22 +18,22 @@ public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@Bean
public CommandLineRunner run(ApplicationContext context) {
return args -> {
StoreQueryService storeService = context.getBean(StoreQueryService.class);

// 파라미터 값 설정
String name = "요아정";
Float score = 4.0f;

// 쿼리 메서드 호출 및 쿼리 문자열과 파라미터 출력
System.out.println("Executing findStoresByNameAndScore with parameters:");
System.out.println("Name: " + name);
System.out.println("Score: " + score);

storeService.findStoresByNameAndScore(name, score)
.forEach(System.out::println);
};
}
// @Bean
// public CommandLineRunner run(ApplicationContext context) {
// return args -> {
// StoreQueryService storeService = context.getBean(StoreQueryService.class);
//
// // 파라미터 값 설정
// String name = "요아정";
// Float score = 4.0f;
//
// // 쿼리 메서드 호출 및 쿼리 문자열과 파라미터 출력
// System.out.println("Executing findStoresByNameAndScore with parameters:");
// System.out.println("Name: " + name);
// System.out.println("Score: " + score);
//
// storeService.findStoresByNameAndScore(name, score)
// .forEach(System.out::println);
// };
// }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package umc.spring.config.security;

import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.DefaultOAuth2User;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;
import umc.spring.domain.Member;
import umc.spring.domain.enums.Gender;
import umc.spring.domain.enums.Role;
import umc.spring.repository.MemberRepository.MemberRepository;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Service
@RequiredArgsConstructor
public class CustomOAuth2UserService extends DefaultOAuth2UserService {

private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;

@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
OAuth2User oAuth2User = super.loadUser(userRequest);

Map<String, Object> attributes = oAuth2User.getAttributes();
Map<String, Object> properties = (Map<String, Object>) attributes.get("properties");

String nickname = (String) properties.get("nickname");
String email = nickname + "@kakao.com"; // 임시 이메일 생성

// 사용자 정보 저장 또는 업데이트
Member member = saveOrUpdateUser(email, nickname);

// 이메일을 Principal로 사용하기 위해 attributes 수정
Map<String, Object> modifiedAttributes = new HashMap<>(attributes);
modifiedAttributes.put("email", email);

return new DefaultOAuth2User(
oAuth2User.getAuthorities(),
modifiedAttributes,
"email" // email Principal로 설정
);
}

private Member saveOrUpdateUser(String email, String nickname) {
Member member = memberRepository.findByEmail(email)
.orElse(Member.builder()
.email(email)
.name(nickname)
.password(passwordEncoder.encode("OAUTH_USER_" + UUID.randomUUID()))
.gender(Gender.NONE) // 기본값 설정
.address("소셜로그인") // 기본값 설정
.specAddress("소셜로그인") // 기본값 설정
.role(Role.USER)
.build());

return memberRepository.save(member);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package umc.spring.config.security;

import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import umc.spring.domain.Member;
import umc.spring.repository.MemberRepository.MemberRepository;

@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {

private final MemberRepository memberRepository;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Member member = memberRepository.findByEmail(username)
.orElseThrow(() -> new UsernameNotFoundException("해당 이메일을 가진 유저가 존재하지 않습니다: " + username));

return org.springframework.security.core.userdetails.User
.withUsername(member.getEmail())
.password(member.getPassword())
.roles(member.getRole().name())
.build();
}
}
44 changes: 44 additions & 0 deletions src/main/java/umc/spring/config/security/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package umc.spring.config.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@EnableWebSecurity
@Configuration
public class SecurityConfig {

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.
authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/home", "/signup", "/members/signup", "/css/**").permitAll()
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login")
.defaultSuccessUrl("/home", true)
.permitAll()
)
.logout((logout) -> logout
.logoutUrl("/logout")
.logoutSuccessUrl("/login?logout")
.permitAll()
)
.oauth2Login(oauth2 -> oauth2
.loginPage("/login")
.defaultSuccessUrl("/home", true)
.permitAll()
);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
7 changes: 5 additions & 2 deletions src/main/java/umc/spring/converter/MemberConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,13 @@ public static Member toMember(MemberRequestDTO.JoinDto request){
}

return Member.builder()
.name(request.getName())
.email(request.getEmail()) // 추가된 코드
.password(request.getPassword()) // 추가된 코드
.gender(gender)
.address(request.getAddress())
.specAddress(request.getSpecAddress())
.gender(gender)
.name(request.getName())
.role(request.getRole()) // 추가된 코드
.memberPreferList(new ArrayList<>())
.build();
}
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/umc/spring/domain/FoodCategory.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package umc.spring.domain;


import jakarta.persistence.*;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.*;
import umc.spring.domain.common.BaseEntity;

Expand All @@ -15,6 +20,7 @@ public class FoodCategory extends BaseEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;


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

Expand Down
23 changes: 19 additions & 4 deletions src/main/java/umc/spring/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.ColumnDefault;

import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import umc.spring.domain.common.BaseEntity;
import umc.spring.domain.enums.Gender;
import umc.spring.domain.enums.MemberStatus;
import umc.spring.domain.enums.Role;
import umc.spring.domain.enums.SocialType;
import umc.spring.domain.mapping.MemberAgree;
import umc.spring.domain.mapping.MemberMission;
Expand All @@ -20,9 +22,9 @@

@Entity
@Getter
@Builder
@DynamicUpdate
@DynamicInsert
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class Member extends BaseEntity {
Expand Down Expand Up @@ -53,11 +55,21 @@ public class Member extends BaseEntity {

private LocalDate inactiveDate;

@ColumnDefault("0")
private Integer point;

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

@Column(nullable = false, length = 50)
private String email;

@ColumnDefault("0")
private Integer point;
@Column(nullable = false)
private String password;

@Enumerated(EnumType.STRING)
private Role role;


@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
private List<MemberAgree> memberAgreeList = new ArrayList<>();
Expand All @@ -70,4 +82,7 @@ public class Member extends BaseEntity {

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
private List<MemberMission> memberMissionList = new ArrayList<>();
}
public void encodePassword(String password) {
this.password = password;
}
}
1 change: 1 addition & 0 deletions src/main/java/umc/spring/domain/Mission.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,5 @@ public class Mission extends BaseEntity {

@OneToMany(mappedBy = "mission", cascade = CascadeType.ALL)
private List<MemberMission> memberMissionList = new ArrayList<>();

}
2 changes: 2 additions & 0 deletions src/main/java/umc/spring/domain/Region.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ public class Region extends BaseEntity {

@OneToMany(mappedBy = "region", cascade = CascadeType.ALL)
private List<Store> memberMissionList = new ArrayList<>();


}
1 change: 0 additions & 1 deletion src/main/java/umc/spring/domain/Review.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import jakarta.persistence.*;
import lombok.*;

import org.hibernate.annotations.CascadeType;
import umc.spring.domain.common.BaseEntity;

Expand Down
1 change: 1 addition & 0 deletions src/main/java/umc/spring/domain/Terms.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class Terms extends BaseEntity {
private Long id;

@Column(nullable = false, length = 20)

private String title;

private String body;
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/umc/spring/domain/enums/Role.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package umc.spring.domain.enums;

public enum Role {
ADMIN, USER
}
3 changes: 3 additions & 0 deletions src/main/java/umc/spring/domain/mapping/MemberMission.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import jakarta.persistence.*;
import lombok.*;

import umc.spring.domain.Member;
import umc.spring.domain.Mission;
import umc.spring.domain.Store;
import umc.spring.domain.Terms;

import umc.spring.domain.common.BaseEntity;
import umc.spring.domain.enums.MissionStatus;

Expand All @@ -32,4 +34,5 @@ public class MemberMission extends BaseEntity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "mission_id")
private Mission mission;

}
Loading