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
43 changes: 43 additions & 0 deletions 조이/JavaExam/src/DialogReader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package chapters.ch10.exceptions;

import javax.swing.*;

public class DialogReader {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ㅋㅋㅋㅋㅋ잠만 얘는 뭔가요?

public String readString(String prompt) {
return JOptionPane.showInputDialog(prompt);
}

public int readInt(String prompt) {
int n;
String input = readString(prompt);
try {
n = Integer.parseInt(input.trim());
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, e.getMessage() + " 정수가 아닙니다.");
n = readInt(prompt); // 재시도
}
return n;
}

public double readDouble(String prompt) {
double n;
String input = readString(prompt);
try {
n = Double.parseDouble(input.trim());
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, e.getMessage() + " 실수가 아닙니다.");
n = readDouble(prompt); // 재시도
}
return n;
}

public static void main(String[] args) {
int n = new DialogReader().readInt("정수를 주세요. 100에서 나누어 드립니다.");
try {
String answer = "100에서 나누기 " + Integer.toString(n) + " = " + (100 / n);
JOptionPane.showMessageDialog(null, answer);
} catch (java.lang.ArithmeticException e) {
JOptionPane.showMessageDialog(null, e.getMessage() + " : 0으로 나눌 수 없습니다.");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public ApiResponse<MemberResDTO.JoinDTO> signUp(
}

// 회원 로그인
@GetMapping("/{memberId}/login")
@PostMapping("/{memberId}/login")
public ApiResponse<MemberResDTO.LoginDTO> login(
@RequestBody MemberReqDTO.LoginDTO dto) {
return ApiResponse.onSuccess(MemberSuccessCode.FOUND, memberService.login(dto));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import umc.server.domain.member.dto.req.MemberReqDTO;
import umc.server.domain.member.dto.res.MemberResDTO;
import umc.server.domain.member.entity.Member;
import umc.server.domain.member.enums.Role;

public class MemberConverter {

Expand All @@ -20,10 +21,15 @@ public static MemberResDTO.JoinDTO toJoinDTO(

// DTO -> Entity
public static Member toMember(
MemberReqDTO.JoinDTO dto
MemberReqDTO.JoinDTO dto,
String password,
Role role
){
return Member.builder()
.name(dto.name())
.email(dto.email())
.password(password)
.role(role)
.birth(dto.birth())
.address(dto.address())
.gender(dto.gender())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package umc.server.domain.member.dto.req;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Getter;
import org.springframework.cglib.core.Local;
Expand All @@ -12,7 +14,12 @@
public class MemberReqDTO {
@Builder
public record JoinDTO(
@NotBlank
String name,
@Email
String email,
@NotBlank

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NotNull과 NotBlank의 차이를 알아두시면 데모데이때 큰 도움이 됩니다!

String password,
Gender gender,
LocalDate birth,
String address,
Expand All @@ -22,6 +29,8 @@ public record JoinDTO(
){}
@Builder
public record LoginDTO(
String memberId
String memberId,
String email,
String password
){}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import umc.server.domain.mapping.mapping.entity.MemberMission;
import umc.server.domain.mapping.mapping.entity.MemberTerm;
import umc.server.domain.member.enums.Gender;
import umc.server.domain.member.enums.Role;
import umc.server.domain.review.entity.Review;
import umc.server.global.BaseEntity;

Expand Down Expand Up @@ -42,24 +43,36 @@ public class Member extends BaseEntity {
@Column(name = "point",length=100)
private Integer point;

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

@Column(nullable = false)
private String password;

@Enumerated(EnumType.STRING)
private Role role;

@Column(name = "tel", length=11)
private String tel;

@OneToMany(mappedBy = "member" ,cascade = CascadeType.REMOVE) //member은 memberfood 엔티티 안의 필드이름
@OneToMany(mappedBy = "member" ,cascade = CascadeType.REMOVE)
@Builder.Default//member은 memberfood 엔티티 안의 필드이름
private List<MemberFood> memberFoods= new ArrayList<>();

@OneToMany(mappedBy = "member" ,cascade = CascadeType.REMOVE) //member은 memberfood 엔티티 안의 필드이름
@OneToMany(mappedBy = "member" ,cascade = CascadeType.REMOVE)
@Builder.Default//member은 memberfood 엔티티 안의 필드이름
private List<MemberTerm> memberTerms= new ArrayList<>();//arraylist로 초기화해서 널 값 아니고 빈 리스트로 존재 []

@OneToMany(mappedBy = "member" )
@Builder.Default // 빌더때매 패스워드 notnull무시되면서 로그인이안됏슨
private List<MemberMission> membermission= new ArrayList<>();


@OneToMany(mappedBy = "member", fetch = FetchType.LAZY)
@Builder.Default
private List<Review> reviews = new ArrayList<>();

@OneToMany(mappedBy = "member", fetch = FetchType.LAZY)
@Builder.Default
private List<Question> questions = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package umc.server.domain.member.enums;

public enum Role {
ROLE_ADMIN,ROLE_USER;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
import umc.server.domain.member.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;


public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByName(@Param("name") String name);

Optional<Member> findByEmail(String email);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import umc.server.domain.mapping.mapping.entity.MemberFood;
import umc.server.domain.mapping.mapping.repository.MemberFoodRepository;
Expand All @@ -10,6 +11,7 @@
import umc.server.domain.member.dto.res.MemberResDTO;
import umc.server.domain.member.entity.Food;
import umc.server.domain.member.entity.Member;
import umc.server.domain.member.enums.Role;
import umc.server.domain.member.exception.FoodException;
import umc.server.domain.member.exception.code.FoodErrorCode;
import umc.server.domain.member.repository.FoodRepository;
Expand All @@ -27,13 +29,16 @@ public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
private final MemberFoodRepository memberFoodRepository;
private final FoodRepository foodRepository;
private final PasswordEncoder passwordEncoder;
// 회원가입
@Override
public MemberResDTO.JoinDTO signup(
MemberReqDTO.JoinDTO dto
) {
//솔트된 비밀번호생성
String salt= passwordEncoder.encode(dto.password());
// 사용자 생성
Member member = MemberConverter.toMember(dto);
Member member = MemberConverter.toMember(dto,salt, Role.ROLE_USER);
// DB 적용
memberRepository.save(member);
// 선호 음식 존재 여부 확인
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package umc.server.global.config;

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.server.domain.member.entity.Member;
import umc.server.domain.member.repository.MemberRepository;

@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {

private final MemberRepository memberRepository;

@Override
public UserDetails loadUserByUsername(String email)
throws UsernameNotFoundException {

Member member = memberRepository.findByEmail(email)
.orElseThrow(() ->
new UsernameNotFoundException("존재하지 않는 회원입니다: " + email)
);

return org.springframework.security.core.userdetails.User.builder()
.username(member.getEmail())
.password(member.getPassword())
.roles(member.getRole().name()) // Role.USER / Role.ADMIN
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package umc.server.global.auth;

public class JwtAuthFilter {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package umc.server.global.auth;

public class JwtUtil {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

얘네는 왜 구현이 안되었을까용

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package umc.server.global.config;

public class AuthenticationEntryPoint {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package umc.server.global.config;

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.config.annotation.web.configurers.AbstractHttpConfigurer;
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 {

private final String[] allowUris = {
"/sign-up",
"/swagger-ui/**",
"/swagger-resources/**",
"/v3/api-docs/**",
};

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(requests -> requests
.requestMatchers(allowUris).permitAll()
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(form -> form
.defaultSuccessUrl("/swagger-ui/index.html", true)
.permitAll()
)
.csrf(AbstractHttpConfigurer::disable)
.logout(logout -> logout
.logoutUrl("/logout")
.logoutSuccessUrl("/login?logout")
.permitAll()
);

return http.build();
}

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}