From a371b1056279db7f381ab90b26d2120fade64315 Mon Sep 17 00:00:00 2001 From: Yun Date: Sat, 28 Jan 2023 16:03:48 +0900 Subject: [PATCH 01/15] =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85?= =?UTF-8?q?=EA=B3=BC=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 6148 bytes build.gradle | 8 +- settings.gradle | 2 +- .../carrot/CarrotApplication.java} | 6 +- .../java/com/project/carrot/SpringConfig.java | 33 ++++++++ .../com/project/carrot/domain/Member.java | 30 +++++++ .../carrot/domain/Service/MemberService.java | 38 +++++++++ .../repository/JPAMemberRepository.java | 35 ++++++++ .../carrot/repository/MemberRepository.java | 13 +++ src/main/resources/application.properties | 14 ++++ .../carrot/CarrotApplicationTests.java} | 4 +- .../project/carrot/MemberRepositorytest.java | 32 ++++++++ .../com/project/carrot/MemberServiceTest.java | 75 ++++++++++++++++++ 13 files changed, 280 insertions(+), 10 deletions(-) create mode 100644 .DS_Store rename src/main/java/com/{dku/springstudy/SpringStudyApplication.java => project/carrot/CarrotApplication.java} (60%) create mode 100644 src/main/java/com/project/carrot/SpringConfig.java create mode 100644 src/main/java/com/project/carrot/domain/Member.java create mode 100644 src/main/java/com/project/carrot/domain/Service/MemberService.java create mode 100644 src/main/java/com/project/carrot/repository/JPAMemberRepository.java create mode 100644 src/main/java/com/project/carrot/repository/MemberRepository.java rename src/test/java/com/{dku/springstudy/SpringStudyApplicationTests.java => project/carrot/CarrotApplicationTests.java} (69%) create mode 100644 src/test/java/com/project/carrot/MemberRepositorytest.java create mode 100644 src/test/java/com/project/carrot/MemberServiceTest.java diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0{throw new IllegalStateException("이미 존재하는 이메일입니다.");}); + memberRepository.save(member); + + return member.getUserId(); + } + + public Long Login(String email, String password){ + Member findMember = memberRepository.findByEmail(email) + .orElseThrow(() -> new IllegalStateException("이메일이 일치하지 않습니다.")); + + if(findMember.getUserPass() != password) throw new IllegalStateException("패스워드가 일치하지 않습니다."); + + return findMember.getUserId(); + } + +} diff --git a/src/main/java/com/project/carrot/repository/JPAMemberRepository.java b/src/main/java/com/project/carrot/repository/JPAMemberRepository.java new file mode 100644 index 0000000..692caa5 --- /dev/null +++ b/src/main/java/com/project/carrot/repository/JPAMemberRepository.java @@ -0,0 +1,35 @@ +package com.project.carrot.repository; + +import com.project.carrot.domain.Member; + +import javax.persistence.EntityManager; +import java.util.List; +import java.util.Optional; + +public class JPAMemberRepository implements MemberRepository{ + private final EntityManager em; + + public JPAMemberRepository(EntityManager em) { + this.em = em; + } + + @Override + public Member save(Member member) { + em.persist(member); + return member; + } + + @Override + public Optional findByEmail(String UserEmail) { + List result = em.createQuery("select m from Member m where UserEmail= :UserEmail" + , Member.class).setParameter("UserEmail",UserEmail).getResultList(); + return result.stream().findAny(); + } + + @Override + public Optional findByName(String UserName) { + List result = em.createQuery("select m from Member m where UserName= :UserName" + , Member.class).setParameter("UserName",UserName).getResultList(); + return result.stream().findAny(); + } +} diff --git a/src/main/java/com/project/carrot/repository/MemberRepository.java b/src/main/java/com/project/carrot/repository/MemberRepository.java new file mode 100644 index 0000000..d8f52d5 --- /dev/null +++ b/src/main/java/com/project/carrot/repository/MemberRepository.java @@ -0,0 +1,13 @@ +package com.project.carrot.repository; + +import com.project.carrot.domain.Member; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +public interface MemberRepository{ + Member save(Member member); + Optional findByEmail(String email); + Optional findByName(String name); +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..c8290c8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,15 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/carrot?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul +spring.datasource.username=root +spring.datasource.password=1224 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +# MySQL ? ??? ?. +spring.jpa.database=mysql + + +# MySQL ?? ?? +spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect + +spring.jpa.hibernate.ddl-auto=update + +spring.jpa.show-sql=true \ No newline at end of file diff --git a/src/test/java/com/dku/springstudy/SpringStudyApplicationTests.java b/src/test/java/com/project/carrot/CarrotApplicationTests.java similarity index 69% rename from src/test/java/com/dku/springstudy/SpringStudyApplicationTests.java rename to src/test/java/com/project/carrot/CarrotApplicationTests.java index 79d9975..753cf97 100644 --- a/src/test/java/com/dku/springstudy/SpringStudyApplicationTests.java +++ b/src/test/java/com/project/carrot/CarrotApplicationTests.java @@ -1,10 +1,10 @@ -package com.dku.springstudy; +package com.project.carrot; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class SpringStudyApplicationTests { +class testCarrotApplicationTests { @Test void contextLoads() { diff --git a/src/test/java/com/project/carrot/MemberRepositorytest.java b/src/test/java/com/project/carrot/MemberRepositorytest.java new file mode 100644 index 0000000..13b5d5d --- /dev/null +++ b/src/test/java/com/project/carrot/MemberRepositorytest.java @@ -0,0 +1,32 @@ +package com.project.carrot; + +import com.project.carrot.domain.Member; +import com.project.carrot.repository.MemberRepository; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@Transactional + +public class MemberRepositorytest { + + @Autowired//이거때문에 하 + MemberRepository memberRepository; + @Test + void 회원등록() throws Exception{ + + Member member=new Member(); + member=member.builder() + .UserEmail("t@52") + .UserPass("12241").UserTel("01022-1").UserName("Yun1") + .NickName("Nick1").Address("incheon1").build(); + + memberRepository.save(member); + + Assertions.assertThat(member.getUserName()).isEqualTo("Yun1"); + + } +} diff --git a/src/test/java/com/project/carrot/MemberServiceTest.java b/src/test/java/com/project/carrot/MemberServiceTest.java new file mode 100644 index 0000000..0a58a16 --- /dev/null +++ b/src/test/java/com/project/carrot/MemberServiceTest.java @@ -0,0 +1,75 @@ +package com.project.carrot; + +import com.project.carrot.domain.Member; +import com.project.carrot.domain.Service.MemberService; +import com.project.carrot.repository.MemberRepository; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@Transactional +public class MemberServiceTest { + @Autowired + MemberService memberService; + @Autowired + MemberRepository memberRepository; + + @Test + void 회원가입() throws Exception{ + Member member=new Member(); + member=member.builder() + .UserEmail("t@5") + .UserPass("1224").UserTel("01022-2").UserName("Yun") + .NickName("Nick").Address("incheon").build(); + + Long id=memberService.join(member); + + Assertions.assertThat(id).isEqualTo(member.getUserId()); + + System.out.println(member); + } + + @Test + void 중복체크() throws Exception{ + Member member=new Member(); + member=member.builder() + .UserEmail("t@5") + .UserPass("1224").UserTel("01022-2").UserName("Yun") + .NickName("Nick").Address("incheon").build(); + + memberService.join(member); + + var ref = new Object() { + Member member2 = new Member(); + }; + ref.member2 = ref.member2.builder() + .UserEmail("t@5") + .UserPass("1224").UserTel("01022-2").UserName("Yun") + .NickName("Nick").Address("incheon").build(); + + IllegalStateException e = org.junit.jupiter.api.Assertions.assertThrows(IllegalStateException.class, + ()->memberService.join(ref.member2)); + + + Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 이메일입니다."); + } + + @Test + void 로그인() throws Exception{ + Member member=new Member(); + member=member.builder() + .UserEmail("t@5") + .UserPass("1224").UserTel("01022-2").UserName("Yun") + .NickName("Nick").Address("incheon").build(); + + Long id=memberService.join(member); + + IllegalStateException e= org.junit.jupiter.api.Assertions.assertThrows(IllegalStateException.class, + ()->memberService.Login("t@56","1225")); + + Assertions.assertThat(e.getMessage()).isEqualTo("이메일이 일치하지 않습니다."); + } +} From 4ba593552ef3388b07aeb61dadb28dc1647f9e59 Mon Sep 17 00:00:00 2001 From: Yun Date: Sun, 29 Jan 2023 17:03:17 +0900 Subject: [PATCH 02/15] =?UTF-8?q?JWT=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20JW?= =?UTF-8?q?T=EB=A5=BC=20=ED=99=9C=EC=9A=A9=ED=95=9C=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=EA=B3=BC=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 7 ++ .../com/project/carrot/SecurityConfig.java | 47 +++++++++++ .../{domain => }/Service/MemberService.java | 24 ++++-- .../java/com/project/carrot/SpringConfig.java | 2 +- .../carrot/controller/JWTController.java | 69 ++++++++++++++++ .../com/project/carrot/domain/Member.java | 51 +++++++++++- .../repository/JPAMemberRepository.java | 10 +++ .../carrot/repository/MemberRepository.java | 1 + .../security/JwtAuthenticationFilter.java | 32 ++++++++ .../carrot/security/JwtTokenProvider.java | 80 +++++++++++++++++++ src/main/resources/application.properties | 6 +- .../com/project/carrot/MemberServiceTest.java | 8 +- 12 files changed, 321 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/project/carrot/SecurityConfig.java rename src/main/java/com/project/carrot/{domain => }/Service/MemberService.java (55%) create mode 100644 src/main/java/com/project/carrot/controller/JWTController.java create mode 100644 src/main/java/com/project/carrot/security/JwtAuthenticationFilter.java create mode 100644 src/main/java/com/project/carrot/security/JwtTokenProvider.java diff --git a/build.gradle b/build.gradle index e8909b1..1f0d64f 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,13 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' + + // jwt + implementation 'io.jsonwebtoken:jjwt:0.9.1' + + //validation + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.slf4j:slf4j-api:1.7.31' } tasks.named('test') { diff --git a/src/main/java/com/project/carrot/SecurityConfig.java b/src/main/java/com/project/carrot/SecurityConfig.java new file mode 100644 index 0000000..3933ee6 --- /dev/null +++ b/src/main/java/com/project/carrot/SecurityConfig.java @@ -0,0 +1,47 @@ +package com.project.carrot; + +import com.project.carrot.security.JwtAuthenticationFilter; +import com.project.carrot.security.JwtTokenProvider; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.security.authentication.AuthenticationManager; +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.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@EnableWebSecurity +@RequiredArgsConstructor +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + private final JwtTokenProvider jwtTokenProvider; + + // authenticationManager를 Bean 등록합니다. + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + + http.csrf().disable(); + //http.httpBasic().disable(); // 일반적인 루트가 아닌 다른 방식으로 요청시 거절, header에 id, pw가 아닌 token(jwt)을 달고 간다. 그래서 basic이 아닌 bearer를 사용한다. + http.httpBasic().disable() + .authorizeRequests()// 요청에 대한 사용권한 체크 + .antMatchers("/test").authenticated() + //.antMatchers("/admin/**").hasRole("ADMIN") + //.antMatchers("/user/**").hasRole("USER") + .antMatchers("/**").permitAll() + .and() + .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), + UsernamePasswordAuthenticationFilter.class); // JwtAuthenticationFilter를 UsernamePasswordAuthenticationFilter 전에 넣는다 + // + 토큰에 저장된 유저정보를 활용하여야 하기 때문에 CustomUserDetailService 클래스를 생성합니다. + http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + + + } +} + diff --git a/src/main/java/com/project/carrot/domain/Service/MemberService.java b/src/main/java/com/project/carrot/Service/MemberService.java similarity index 55% rename from src/main/java/com/project/carrot/domain/Service/MemberService.java rename to src/main/java/com/project/carrot/Service/MemberService.java index 3d5fe57..d495062 100644 --- a/src/main/java/com/project/carrot/domain/Service/MemberService.java +++ b/src/main/java/com/project/carrot/Service/MemberService.java @@ -1,9 +1,12 @@ -package com.project.carrot.domain.Service; +package com.project.carrot.Service; import com.project.carrot.domain.Member; import com.project.carrot.repository.MemberRepository; import lombok.NoArgsConstructor; 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 org.springframework.transaction.annotation.Transactional; @@ -12,27 +15,32 @@ @RequiredArgsConstructor @Transactional//JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행되어야만 한다. -public class MemberService { +public class MemberService implements UserDetailsService { /* 회원가입, 로그인 기능 개발 */ private final MemberRepository memberRepository; - public Long join(Member member){ + public Member join(Member member){ memberRepository.findByEmail(member.getUserEmail()) .ifPresent(m->{throw new IllegalStateException("이미 존재하는 이메일입니다.");}); - memberRepository.save(member); - return member.getUserId(); + return memberRepository.save(member); } - public Long Login(String email, String password){ + //컨트롤러에서 역할 수행하게 되어 주석처리 + /*public Member Login(String email, String password){ Member findMember = memberRepository.findByEmail(email) .orElseThrow(() -> new IllegalStateException("이메일이 일치하지 않습니다.")); if(findMember.getUserPass() != password) throw new IllegalStateException("패스워드가 일치하지 않습니다."); - return findMember.getUserId(); - } + return findMember; + }*/ + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + return memberRepository.findByEmail(username) + .orElseThrow(()->new UsernameNotFoundException("사용자를 찾을 수 없습니다.")); + } } diff --git a/src/main/java/com/project/carrot/SpringConfig.java b/src/main/java/com/project/carrot/SpringConfig.java index 05a1c86..a1dd697 100644 --- a/src/main/java/com/project/carrot/SpringConfig.java +++ b/src/main/java/com/project/carrot/SpringConfig.java @@ -1,6 +1,6 @@ package com.project.carrot; -import com.project.carrot.domain.Service.MemberService; +import com.project.carrot.Service.MemberService; import com.project.carrot.repository.JPAMemberRepository; import com.project.carrot.repository.MemberRepository; import org.springframework.context.annotation.Bean; diff --git a/src/main/java/com/project/carrot/controller/JWTController.java b/src/main/java/com/project/carrot/controller/JWTController.java new file mode 100644 index 0000000..992908a --- /dev/null +++ b/src/main/java/com/project/carrot/controller/JWTController.java @@ -0,0 +1,69 @@ +package com.project.carrot.controller; + +import com.project.carrot.domain.Member; +import com.project.carrot.Service.MemberService; +import com.project.carrot.repository.MemberRepository; +import com.project.carrot.security.JwtTokenProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.hibernate.validator.constraints.Email; +import org.springframework.boot.autoconfigure.kafka.KafkaProperties; +import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.Map; + + +@Slf4j //로깅할때 쓰는 어노테이션 +@RestController +@RequiredArgsConstructor +public class JWTController { + + private final MemberRepository memberRepository; + private final MemberService memberService; + private final JwtTokenProvider jwtTokenProvider; + + + final String EMAIL = "aabbcc@gmail.com"; + final String PASS = "th1234"; + final String TEL="010-1111-1111"; + final String USERNAME="Yun"; + final String NICKNAME = "침착맨"; + final String ADDRESS= "Incheon"; + + //final KafkaProperties.Admin ADMIN = Admin.일반회원; 권한설정 필요할 경우 설정 + + /* 테스트용 유저 생성 + Member user = Member.builder() + .UserEmail(EMAIL) + .UserPass(PASS) + .NickName(NICKNAME) + //권한 설정이 필요할 경우 enum 써서 .admin(ADMIN) + .UserTel(TEL) + .UserName(USERNAME) + .Address(ADDRESS) + .roles(Collections.singletonList("ROLE_USER")) // 최초 가입시 USER 로 설정 + .build(); + + */ + @PostMapping(value = "/join") + public String joinUser() throws Exception{ + log.info("회원가입 시도"); + memberService.join(user); + + return user.toString(); + } + + @PostMapping(value = "/login") + public String login(@RequestBody Map user){ + Member member=memberRepository.findByEmail(user.get("email")) + .orElseThrow(()->new IllegalArgumentException("가입되지 않은 이메일입니다.")); + + Member member1=memberRepository.findByPass(user.get("password")) + .orElseThrow(()->new IllegalArgumentException("비밀번호가 일치하지 않습니다.")); + + return jwtTokenProvider.createToken(member.getUsername(), member.getRoles()); + } +} diff --git a/src/main/java/com/project/carrot/domain/Member.java b/src/main/java/com/project/carrot/domain/Member.java index d8e4902..bd45c83 100644 --- a/src/main/java/com/project/carrot/domain/Member.java +++ b/src/main/java/com/project/carrot/domain/Member.java @@ -1,10 +1,18 @@ package com.project.carrot.domain; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.*; import org.apache.catalina.User; import org.springframework.lang.Nullable; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; import javax.persistence.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; @Getter @AllArgsConstructor @@ -12,7 +20,7 @@ @Entity //객체라는 것을 알림 @ToString @Builder -public class Member { +public class Member implements UserDetails{ @Id //Id는 pk @GeneratedValue(strategy = GenerationType.AUTO) private Long UserId; @@ -26,5 +34,46 @@ public class Member { @Builder.Default private String ProfilePhotoURL=null; + @ElementCollection(fetch = FetchType.EAGER) + @Builder.Default + private List roles = new ArrayList<>(); + + @Override + public Collection getAuthorities(){ + return this.roles.stream() + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + } + + @Override + public String getPassword() { + return UserPass; + } + + @Override + public String getUsername() { + return UserEmail; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } + } diff --git a/src/main/java/com/project/carrot/repository/JPAMemberRepository.java b/src/main/java/com/project/carrot/repository/JPAMemberRepository.java index 692caa5..0cdf0ea 100644 --- a/src/main/java/com/project/carrot/repository/JPAMemberRepository.java +++ b/src/main/java/com/project/carrot/repository/JPAMemberRepository.java @@ -32,4 +32,14 @@ public Optional findByName(String UserName) { , Member.class).setParameter("UserName",UserName).getResultList(); return result.stream().findAny(); } + + @Override + public Optional findByPass(String UserPass) { + List result = em.createQuery("select m from Member m where UserPass= :UserPass" + , Member.class).setParameter("UserPass",UserPass).getResultList(); + + return result.stream().findAny(); + } + + } diff --git a/src/main/java/com/project/carrot/repository/MemberRepository.java b/src/main/java/com/project/carrot/repository/MemberRepository.java index d8f52d5..db1fb33 100644 --- a/src/main/java/com/project/carrot/repository/MemberRepository.java +++ b/src/main/java/com/project/carrot/repository/MemberRepository.java @@ -10,4 +10,5 @@ public interface MemberRepository{ Member save(Member member); Optional findByEmail(String email); Optional findByName(String name); + Optional findByPass(String pass); } diff --git a/src/main/java/com/project/carrot/security/JwtAuthenticationFilter.java b/src/main/java/com/project/carrot/security/JwtAuthenticationFilter.java new file mode 100644 index 0000000..44ddddb --- /dev/null +++ b/src/main/java/com/project/carrot/security/JwtAuthenticationFilter.java @@ -0,0 +1,32 @@ +package com.project.carrot.security; + +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.filter.GenericFilterBean; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +@RequiredArgsConstructor +public class JwtAuthenticationFilter extends GenericFilterBean { + private final JwtTokenProvider jwtTokenProvider; + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + // 헤더에서 JWT 를 받아옵니다. + String token = jwtTokenProvider.resolveToken((HttpServletRequest) request); + // 유효한 토큰인지 확인합니다. + if (token != null && jwtTokenProvider.validateToken(token)) { + // 토큰이 유효하면 토큰으로부터 유저 정보를 받아옵니다. + Authentication authentication = jwtTokenProvider.getAuthentication(token); + // SecurityContext 에 Authentication 객체를 저장합니다. + SecurityContextHolder.getContext().setAuthentication(authentication); + } + chain.doFilter(request, response); + } +} diff --git a/src/main/java/com/project/carrot/security/JwtTokenProvider.java b/src/main/java/com/project/carrot/security/JwtTokenProvider.java new file mode 100644 index 0000000..fef14bc --- /dev/null +++ b/src/main/java/com/project/carrot/security/JwtTokenProvider.java @@ -0,0 +1,80 @@ +package com.project.carrot.security; + +import com.project.carrot.Service.MemberService; +import com.project.carrot.domain.Member; +import com.project.carrot.repository.MemberRepository; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jws; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import java.util.Base64; +import java.util.Date; +import java.util.List; +import java.util.Optional; + +@RequiredArgsConstructor +@Component +public class JwtTokenProvider { + private String secretKey = "1myprojectsecret1"; + + // 토큰 유효시간 30분 + private long tokenValidTime = 30 * 60 * 1000L; + + private final UserDetailsService userDetailsService; + + // 객체 초기화, secretKey를 Base64로 인코딩한다. + @PostConstruct + protected void init() { + secretKey = Base64.getEncoder().encodeToString(secretKey.getBytes()); + } + + // JWT 토큰 생성 + public String createToken(String userPk, List roles) { + Claims claims = Jwts.claims().setSubject(userPk); // JWT payload 에 저장되는 정보단위, 보통 여기서 user를 식별하는 값을 넣는다. + claims.put("roles", roles); // 정보는 key / value 쌍으로 저장된다. + Date now = new Date(); + return Jwts.builder() + .setClaims(claims) // 정보 저장 + .setIssuedAt(now) // 토큰 발행 시간 정보 + .setExpiration(new Date(now.getTime() + tokenValidTime)) // set Expire Time + .signWith(SignatureAlgorithm.HS256, secretKey) // 사용할 암호화 알고리즘과 + // signature 에 들어갈 secret값 세팅 + .compact(); + } + + // JWT 토큰에서 인증 정보 조회 + public Authentication getAuthentication(String token) { + UserDetails userDetails = userDetailsService.loadUserByUsername(this.getUserPk(token)); + return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities()); + } + + // 토큰에서 회원 정보 추출 + public String getUserPk(String token) { + return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getSubject(); + } + + // Request의 Header에서 token 값을 가져옵니다. "Authorization" : "TOKEN값' + public String resolveToken(HttpServletRequest request) { + return request.getHeader("Authorization"); + } + + // 토큰의 유효성 + 만료일자 확인 + public boolean validateToken(String jwtToken) { + try { + Jws claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwtToken); + return !claims.getBody().getExpiration().before(new Date()); + } catch (Exception e) { + return false; + } + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c8290c8..474409b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,6 +10,8 @@ spring.jpa.database=mysql # MySQL ?? ?? spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect -spring.jpa.hibernate.ddl-auto=update +spring.jpa.hibernate.ddl-auto=create-drop -spring.jpa.show-sql=true \ No newline at end of file +spring.jpa.show-sql=true + +#token secret key \ No newline at end of file diff --git a/src/test/java/com/project/carrot/MemberServiceTest.java b/src/test/java/com/project/carrot/MemberServiceTest.java index 0a58a16..ae6392f 100644 --- a/src/test/java/com/project/carrot/MemberServiceTest.java +++ b/src/test/java/com/project/carrot/MemberServiceTest.java @@ -1,7 +1,7 @@ package com.project.carrot; import com.project.carrot.domain.Member; -import com.project.carrot.domain.Service.MemberService; +import com.project.carrot.Service.MemberService; import com.project.carrot.repository.MemberRepository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -25,9 +25,9 @@ public class MemberServiceTest { .UserPass("1224").UserTel("01022-2").UserName("Yun") .NickName("Nick").Address("incheon").build(); - Long id=memberService.join(member); + memberService.join(member); - Assertions.assertThat(id).isEqualTo(member.getUserId()); + //Assertions.assertThat(id).isEqualTo(member.getUserId()); System.out.println(member); } @@ -65,7 +65,7 @@ public class MemberServiceTest { .UserPass("1224").UserTel("01022-2").UserName("Yun") .NickName("Nick").Address("incheon").build(); - Long id=memberService.join(member); + memberService.join(member); IllegalStateException e= org.junit.jupiter.api.Assertions.assertThrows(IllegalStateException.class, ()->memberService.Login("t@56","1225")); From 93e44d85f6562273f34bda886ace33a38967f2b2 Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Thu, 2 Feb 2023 05:31:49 +0900 Subject: [PATCH 03/15] =?UTF-8?q?dto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +- .../project/carrot/Service/MemberService.java | 9 ++-- .../carrot/controller/JWTController.java | 47 +++++-------------- .../com/project/carrot/domain/Member.java | 10 ++++ .../project/carrot/domain/PostSaveDTO.java | 21 +++++++++ 5 files changed, 52 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/project/carrot/domain/PostSaveDTO.java diff --git a/build.gradle b/build.gradle index 1f0d64f..6f1f981 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' - compileOnly 'org.projectlombok:lombok' + implementation 'org.jetbrains:annotations:23.0.0' + compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.mysql:mysql-connector-j' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/src/main/java/com/project/carrot/Service/MemberService.java b/src/main/java/com/project/carrot/Service/MemberService.java index d495062..fa61ed1 100644 --- a/src/main/java/com/project/carrot/Service/MemberService.java +++ b/src/main/java/com/project/carrot/Service/MemberService.java @@ -1,6 +1,7 @@ package com.project.carrot.Service; import com.project.carrot.domain.Member; +import com.project.carrot.domain.PostSaveDTO; import com.project.carrot.repository.MemberRepository; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; @@ -21,11 +22,13 @@ public class MemberService implements UserDetailsService { */ private final MemberRepository memberRepository; - public Member join(Member member){ - memberRepository.findByEmail(member.getUserEmail()) + public Member join(PostSaveDTO postSaveDTO){ + memberRepository.findByEmail(postSaveDTO.getEMAIL()) .ifPresent(m->{throw new IllegalStateException("이미 존재하는 이메일입니다.");}); - return memberRepository.save(member); + Member member=memberRepository.save(Member.builder(postSaveDTO).build()); + + return member; } //컨트롤러에서 역할 수행하게 되어 주석처리 diff --git a/src/main/java/com/project/carrot/controller/JWTController.java b/src/main/java/com/project/carrot/controller/JWTController.java index 992908a..9f61877 100644 --- a/src/main/java/com/project/carrot/controller/JWTController.java +++ b/src/main/java/com/project/carrot/controller/JWTController.java @@ -2,6 +2,7 @@ import com.project.carrot.domain.Member; import com.project.carrot.Service.MemberService; +import com.project.carrot.domain.PostSaveDTO; import com.project.carrot.repository.MemberRepository; import com.project.carrot.security.JwtTokenProvider; import lombok.RequiredArgsConstructor; @@ -12,7 +13,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.Collections; import java.util.Map; @@ -26,44 +26,23 @@ public class JWTController { private final JwtTokenProvider jwtTokenProvider; - final String EMAIL = "aabbcc@gmail.com"; - final String PASS = "th1234"; - final String TEL="010-1111-1111"; - final String USERNAME="Yun"; - final String NICKNAME = "침착맨"; - final String ADDRESS= "Incheon"; - - //final KafkaProperties.Admin ADMIN = Admin.일반회원; 권한설정 필요할 경우 설정 - - /* 테스트용 유저 생성 - Member user = Member.builder() - .UserEmail(EMAIL) - .UserPass(PASS) - .NickName(NICKNAME) - //권한 설정이 필요할 경우 enum 써서 .admin(ADMIN) - .UserTel(TEL) - .UserName(USERNAME) - .Address(ADDRESS) - .roles(Collections.singletonList("ROLE_USER")) // 최초 가입시 USER 로 설정 - .build(); - - */ @PostMapping(value = "/join") - public String joinUser() throws Exception{ + public String joinUser(@RequestBody PostSaveDTO postSaveDTO) { log.info("회원가입 시도"); - memberService.join(user); + memberService.join(postSaveDTO); - return user.toString(); + return postSaveDTO.toString(); } - @PostMapping(value = "/login") - public String login(@RequestBody Map user){ - Member member=memberRepository.findByEmail(user.get("email")) - .orElseThrow(()->new IllegalArgumentException("가입되지 않은 이메일입니다.")); +// @PostMapping(value = "/login") +// public String login(@RequestBody Map user) { +// Member member=memberRepository.findByEmail(user.get("email")) +// .orElseThrow(()->new IllegalArgumentException("가입되지 않은 이메일입니다.")); - Member member1=memberRepository.findByPass(user.get("password")) - .orElseThrow(()->new IllegalArgumentException("비밀번호가 일치하지 않습니다.")); +// Member member1=memberRepository.findByPass(user.get("password")) +// .orElseThrow(()->new IllegalArgumentException("비밀번호가 일치하지 않습니다.")); - return jwtTokenProvider.createToken(member.getUsername(), member.getRoles()); - } +// return jwtTokenProvider.createToken(member.getUsername(), member.getRoles()); +// } +// } } diff --git a/src/main/java/com/project/carrot/domain/Member.java b/src/main/java/com/project/carrot/domain/Member.java index bd45c83..a1a41e0 100644 --- a/src/main/java/com/project/carrot/domain/Member.java +++ b/src/main/java/com/project/carrot/domain/Member.java @@ -75,5 +75,15 @@ public boolean isEnabled() { return true; } + public static MemberBuilder builder(PostSaveDTO postSaveDTO) { + return new MemberBuilder() + .UserEmail(postSaveDTO.getEMAIL()) + .UserPass(postSaveDTO.getPASS()) + .UserTel(postSaveDTO.getTEL()) + .UserName(postSaveDTO.getUSERNAME()) + .NickName(postSaveDTO.getNICKNAME()) + .Address(postSaveDTO.getADDRESS()); + } + } diff --git a/src/main/java/com/project/carrot/domain/PostSaveDTO.java b/src/main/java/com/project/carrot/domain/PostSaveDTO.java new file mode 100644 index 0000000..fd6d8a1 --- /dev/null +++ b/src/main/java/com/project/carrot/domain/PostSaveDTO.java @@ -0,0 +1,21 @@ +package com.project.carrot.domain; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class PostSaveDTO { + private String EMAIL; + private String PASS; + private String TEL; + private String USERNAME; + private String NICKNAME; + private String ADDRESS; + + //final KafkaProperties.Admin ADMIN = Admin.일반회원; 권한설정 필요할 경우 설정 +} + + From 855e9e07ff6af616f3c64189ad1ea1abacd99f2c Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Fri, 3 Feb 2023 01:37:00 +0900 Subject: [PATCH 04/15] =?UTF-8?q?=EC=9D=B8=ED=84=B0=EC=85=89=ED=84=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20DTO=EB=A5=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85?= =?UTF-8?q?=EA=B3=BC=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/project/carrot/MyInterceptor.java | 57 +++++++++++++++++++ .../project/carrot/Service/MemberService.java | 8 +-- .../carrot/config/InterceptorConfig.java | 19 +++++++ .../carrot/{ => config}/SecurityConfig.java | 2 +- .../carrot/{ => config}/SpringConfig.java | 2 +- .../carrot/controller/JWTController.java | 28 ++++----- .../com/project/carrot/domain/Member.java | 18 +++--- .../project/carrot/domain/PostSaveDTO.java | 30 ++++++++-- .../carrot/domain/SuccessResponseDTO.java | 19 +++++++ .../security/JwtAuthenticationFilter.java | 11 +++- src/main/resources/application.properties | 2 +- 11 files changed, 158 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/project/carrot/MyInterceptor.java create mode 100644 src/main/java/com/project/carrot/config/InterceptorConfig.java rename src/main/java/com/project/carrot/{ => config}/SecurityConfig.java (98%) rename src/main/java/com/project/carrot/{ => config}/SpringConfig.java (95%) create mode 100644 src/main/java/com/project/carrot/domain/SuccessResponseDTO.java diff --git a/src/main/java/com/project/carrot/MyInterceptor.java b/src/main/java/com/project/carrot/MyInterceptor.java new file mode 100644 index 0000000..834bb28 --- /dev/null +++ b/src/main/java/com/project/carrot/MyInterceptor.java @@ -0,0 +1,57 @@ +package com.project.carrot; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.project.carrot.domain.PostSaveDTO; +import com.project.carrot.domain.SuccessResponseDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.util.ContentCachingResponseWrapper; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Slf4j //로깅에 사용하는 어노테이션 +@RequiredArgsConstructor +@Component +public class MyInterceptor implements HandlerInterceptor { + private final ObjectMapper objectMapper; + @Override + public void afterCompletion( + HttpServletRequest request, + HttpServletResponse response, + Object object, + Exception ex + ) throws Exception { + //wrapping 된 Response 가 넘어 올 것이다. + final ContentCachingResponseWrapper cachingResponse = (ContentCachingResponseWrapper) response; + //200번대 응답이 아닌 경우 Interceptor 를 거치지 않는다. + if (!String.valueOf(response.getStatus()).startsWith("2")) { + return; + } + //Json형식의 응답값만 수정 - @ResponseBody를 통해 Object반환은 JSON으로 넘어옴. + if (cachingResponse.getContentType() != null && (cachingResponse.getContentType().contains("application/json"))) { + if (cachingResponse.getContentAsByteArray().length != 0) { + //String 변환 ex){"key":"value"} + String body = new String(cachingResponse.getContentAsByteArray()); + + //Object형식으로 변환 -> Response에 꽂아주기 위함. + Object data = objectMapper.readValue(body, Object.class); + + //ResponseEntity 생성 + SuccessResponseDTO objectResponseDTO = new SuccessResponseDTO<>(data); + + //String 변환 -> Byte로 쓰기 위함. + String wrappedBody = objectMapper.writeValueAsString(objectResponseDTO); + + //flush + cachingResponse.resetBuffer(); + + //덮어쓰기 + cachingResponse.getOutputStream().write(wrappedBody.getBytes(), 0, wrappedBody.getBytes().length); + log.info("Response Body : {}", wrappedBody); + } + } + } +} diff --git a/src/main/java/com/project/carrot/Service/MemberService.java b/src/main/java/com/project/carrot/Service/MemberService.java index fa61ed1..5617186 100644 --- a/src/main/java/com/project/carrot/Service/MemberService.java +++ b/src/main/java/com/project/carrot/Service/MemberService.java @@ -22,13 +22,11 @@ public class MemberService implements UserDetailsService { */ private final MemberRepository memberRepository; - public Member join(PostSaveDTO postSaveDTO){ - memberRepository.findByEmail(postSaveDTO.getEMAIL()) + public Member join(Member member){ + memberRepository.findByEmail(member.getUserEmail()) .ifPresent(m->{throw new IllegalStateException("이미 존재하는 이메일입니다.");}); - Member member=memberRepository.save(Member.builder(postSaveDTO).build()); - - return member; + return memberRepository.save(member); } //컨트롤러에서 역할 수행하게 되어 주석처리 diff --git a/src/main/java/com/project/carrot/config/InterceptorConfig.java b/src/main/java/com/project/carrot/config/InterceptorConfig.java new file mode 100644 index 0000000..b4e9d4c --- /dev/null +++ b/src/main/java/com/project/carrot/config/InterceptorConfig.java @@ -0,0 +1,19 @@ +package com.project.carrot.config; + +import com.project.carrot.MyInterceptor; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration //설정 파일이고 Bean을 등록할 것이다. +@RequiredArgsConstructor +public class InterceptorConfig implements WebMvcConfigurer { + private final MyInterceptor myInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry){ + registry.addInterceptor(myInterceptor) + .addPathPatterns("/**"); //localhost:8080 의 이하 경로 + } +} diff --git a/src/main/java/com/project/carrot/SecurityConfig.java b/src/main/java/com/project/carrot/config/SecurityConfig.java similarity index 98% rename from src/main/java/com/project/carrot/SecurityConfig.java rename to src/main/java/com/project/carrot/config/SecurityConfig.java index 3933ee6..cdae12f 100644 --- a/src/main/java/com/project/carrot/SecurityConfig.java +++ b/src/main/java/com/project/carrot/config/SecurityConfig.java @@ -1,4 +1,4 @@ -package com.project.carrot; +package com.project.carrot.config; import com.project.carrot.security.JwtAuthenticationFilter; import com.project.carrot.security.JwtTokenProvider; diff --git a/src/main/java/com/project/carrot/SpringConfig.java b/src/main/java/com/project/carrot/config/SpringConfig.java similarity index 95% rename from src/main/java/com/project/carrot/SpringConfig.java rename to src/main/java/com/project/carrot/config/SpringConfig.java index a1dd697..a11de0d 100644 --- a/src/main/java/com/project/carrot/SpringConfig.java +++ b/src/main/java/com/project/carrot/config/SpringConfig.java @@ -1,4 +1,4 @@ -package com.project.carrot; +package com.project.carrot.config; import com.project.carrot.Service.MemberService; import com.project.carrot.repository.JPAMemberRepository; diff --git a/src/main/java/com/project/carrot/controller/JWTController.java b/src/main/java/com/project/carrot/controller/JWTController.java index 9f61877..144b92c 100644 --- a/src/main/java/com/project/carrot/controller/JWTController.java +++ b/src/main/java/com/project/carrot/controller/JWTController.java @@ -1,5 +1,6 @@ package com.project.carrot.controller; +import com.project.carrot.MyInterceptor; import com.project.carrot.domain.Member; import com.project.carrot.Service.MemberService; import com.project.carrot.domain.PostSaveDTO; @@ -27,22 +28,23 @@ public class JWTController { @PostMapping(value = "/join") - public String joinUser(@RequestBody PostSaveDTO postSaveDTO) { + public Member joinUser(@RequestBody PostSaveDTO postSaveDTO) { log.info("회원가입 시도"); - memberService.join(postSaveDTO); - - return postSaveDTO.toString(); + Member member = postSaveDTO.toEntity(); + return memberService.join(member); } -// @PostMapping(value = "/login") -// public String login(@RequestBody Map user) { -// Member member=memberRepository.findByEmail(user.get("email")) -// .orElseThrow(()->new IllegalArgumentException("가입되지 않은 이메일입니다.")); + @PostMapping(value = "/login") + public String login(@RequestBody Map user) { + Member member=memberRepository.findByEmail(user.get("EMAIL")) + .orElseThrow(()->new IllegalArgumentException("가입되지 않은 이메일입니다.")); + + log.info(user.get("PASS")); + log.info(member.getPassword()); -// Member member1=memberRepository.findByPass(user.get("password")) -// .orElseThrow(()->new IllegalArgumentException("비밀번호가 일치하지 않습니다.")); + if(!user.get("PASS").equals(member.getPassword())) + throw new IllegalArgumentException("비밀번호가 일치하지 않습니다."); -// return jwtTokenProvider.createToken(member.getUsername(), member.getRoles()); -// } -// } + return jwtTokenProvider.createToken(member.getUsername(), member.getRoles()); + } } diff --git a/src/main/java/com/project/carrot/domain/Member.java b/src/main/java/com/project/carrot/domain/Member.java index a1a41e0..e768435 100644 --- a/src/main/java/com/project/carrot/domain/Member.java +++ b/src/main/java/com/project/carrot/domain/Member.java @@ -75,15 +75,15 @@ public boolean isEnabled() { return true; } - public static MemberBuilder builder(PostSaveDTO postSaveDTO) { - return new MemberBuilder() - .UserEmail(postSaveDTO.getEMAIL()) - .UserPass(postSaveDTO.getPASS()) - .UserTel(postSaveDTO.getTEL()) - .UserName(postSaveDTO.getUSERNAME()) - .NickName(postSaveDTO.getNICKNAME()) - .Address(postSaveDTO.getADDRESS()); - } +// public static MemberBuilder builder(PostSaveDTO postSaveDTO) { +// return new MemberBuilder() +// .UserEmail(postSaveDTO.getEMAIL()) +// .UserPass(postSaveDTO.getPASS()) +// .UserTel(postSaveDTO.getTEL()) +// .UserName(postSaveDTO.getUSERNAME()) +// .NickName(postSaveDTO.getNICKNAME()) +// .Address(postSaveDTO.getADDRESS()); +// } } diff --git a/src/main/java/com/project/carrot/domain/PostSaveDTO.java b/src/main/java/com/project/carrot/domain/PostSaveDTO.java index fd6d8a1..39f4306 100644 --- a/src/main/java/com/project/carrot/domain/PostSaveDTO.java +++ b/src/main/java/com/project/carrot/domain/PostSaveDTO.java @@ -1,12 +1,8 @@ package com.project.carrot.domain; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; +import lombok.*; -@Getter -@RequiredArgsConstructor +@Data public class PostSaveDTO { private String EMAIL; private String PASS; @@ -16,6 +12,28 @@ public class PostSaveDTO { private String ADDRESS; //final KafkaProperties.Admin ADMIN = Admin.일반회원; 권한설정 필요할 경우 설정 + + + @Builder + public PostSaveDTO(String EMAIL,String PASS,String TEL,String USERNAME,String NICKNAME,String ADDRESS){ + this.EMAIL=EMAIL; + this.PASS=PASS; + this.TEL=TEL; + this.USERNAME=USERNAME; + this.NICKNAME=NICKNAME; + this.ADDRESS=ADDRESS; + } + + public Member toEntity(){ + return Member.builder() + .UserEmail(EMAIL) + .UserPass(PASS) + .UserTel(TEL) + .UserName(USERNAME) + .NickName(NICKNAME) + .Address(ADDRESS) + .build(); + } } diff --git a/src/main/java/com/project/carrot/domain/SuccessResponseDTO.java b/src/main/java/com/project/carrot/domain/SuccessResponseDTO.java new file mode 100644 index 0000000..bd129cf --- /dev/null +++ b/src/main/java/com/project/carrot/domain/SuccessResponseDTO.java @@ -0,0 +1,19 @@ +package com.project.carrot.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.lang.Nullable; + +@AllArgsConstructor +@Getter +public class SuccessResponseDTO { //응답값을 통일하기 위한 DTO 생성 + private final Boolean success; + private final T data; + + public SuccessResponseDTO(@Nullable T data){ + this.success=true; + this.data=data; + } +} + +//다른 곳에서는 resultCode까지 반환했음 \ No newline at end of file diff --git a/src/main/java/com/project/carrot/security/JwtAuthenticationFilter.java b/src/main/java/com/project/carrot/security/JwtAuthenticationFilter.java index 44ddddb..eb7115f 100644 --- a/src/main/java/com/project/carrot/security/JwtAuthenticationFilter.java +++ b/src/main/java/com/project/carrot/security/JwtAuthenticationFilter.java @@ -4,12 +4,15 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.filter.GenericFilterBean; +import org.springframework.web.util.ContentCachingRequestWrapper; +import org.springframework.web.util.ContentCachingResponseWrapper; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; @RequiredArgsConstructor @@ -18,7 +21,10 @@ public class JwtAuthenticationFilter extends GenericFilterBean { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - // 헤더에서 JWT 를 받아옵니다. + //SecurityFilter에서 넘어오는 Request & Response를 래핑(캐싱) + ContentCachingRequestWrapper wrappingRequest = new ContentCachingRequestWrapper((HttpServletRequest) request); + ContentCachingResponseWrapper wrappingResponse = new ContentCachingResponseWrapper((HttpServletResponse) response); + // 이하는 JWT 로직, 헤더에서 JWT 를 받아옵니다. String token = jwtTokenProvider.resolveToken((HttpServletRequest) request); // 유효한 토큰인지 확인합니다. if (token != null && jwtTokenProvider.validateToken(token)) { @@ -27,6 +33,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha // SecurityContext 에 Authentication 객체를 저장합니다. SecurityContextHolder.getContext().setAuthentication(authentication); } - chain.doFilter(request, response); + chain.doFilter(wrappingRequest, wrappingResponse); + wrappingResponse.copyBodyToResponse(); //캐싱된 응답값을 덮어씀 } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 474409b..91940d8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,7 +10,7 @@ spring.jpa.database=mysql # MySQL ?? ?? spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect -spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true From d034d6da5f6b02b6716872176db2a7f7a0180c92 Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Fri, 3 Feb 2023 11:30:47 +0900 Subject: [PATCH 05/15] =?UTF-8?q?ErrorCode,Exception,Exception=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=EA=B0=92=20=EB=A7=8C=EB=93=A4=EA=B8=B0,RestController?= =?UTF-8?q?Advice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/project/carrot/CustomException.java | 11 +++++++++ .../carrot/controller/ControllerAdvisor.java | 19 +++++++++++++++ .../com/project/carrot/domain/ErrorCode.java | 14 +++++++++++ .../project/carrot/domain/ExceptionDTO.java | 23 +++++++++++++++++++ 4 files changed, 67 insertions(+) create mode 100644 src/main/java/com/project/carrot/CustomException.java create mode 100644 src/main/java/com/project/carrot/controller/ControllerAdvisor.java create mode 100644 src/main/java/com/project/carrot/domain/ErrorCode.java create mode 100644 src/main/java/com/project/carrot/domain/ExceptionDTO.java diff --git a/src/main/java/com/project/carrot/CustomException.java b/src/main/java/com/project/carrot/CustomException.java new file mode 100644 index 0000000..5644505 --- /dev/null +++ b/src/main/java/com/project/carrot/CustomException.java @@ -0,0 +1,11 @@ +package com.project.carrot; + +import com.project.carrot.domain.ErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class CustomException extends RuntimeException{ + ErrorCode errorCode; +} diff --git a/src/main/java/com/project/carrot/controller/ControllerAdvisor.java b/src/main/java/com/project/carrot/controller/ControllerAdvisor.java new file mode 100644 index 0000000..9a30fa4 --- /dev/null +++ b/src/main/java/com/project/carrot/controller/ControllerAdvisor.java @@ -0,0 +1,19 @@ +package com.project.carrot.controller; + +import com.project.carrot.CustomException; +import com.project.carrot.domain.ExceptionDTO; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice //@ControllerAdvice + @ResponseBody +//@ControllerAdvice는 컨트롤러에서 발생하는 에러를 처리 //SecurityFilter에서 발생하는 예외는 스프링의 것이 아니므로 처리하지 못함 +//@ResponseBody: 응답값 String->Stirng, Object->Json 형식으로 반환해준다. +//@ExceptionHandler: 특정 예외처리를 지정하여 관리 +public class ControllerAdvisor { + @ExceptionHandler(value = {CustomException.class}) + protected ResponseEntity exceptionHandler(CustomException e){ + return ResponseEntity.status(e.getErrorCode().getStatus()) + .body(new ExceptionDTO(e)); + } +} diff --git a/src/main/java/com/project/carrot/domain/ErrorCode.java b/src/main/java/com/project/carrot/domain/ErrorCode.java new file mode 100644 index 0000000..ae930be --- /dev/null +++ b/src/main/java/com/project/carrot/domain/ErrorCode.java @@ -0,0 +1,14 @@ +package com.project.carrot.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum ErrorCode { + CUSTOM_ERROR(HttpStatus.BAD_REQUEST,"잘못된 요청입니다 :)"); + + private final HttpStatus status; + private final String message; +} diff --git a/src/main/java/com/project/carrot/domain/ExceptionDTO.java b/src/main/java/com/project/carrot/domain/ExceptionDTO.java new file mode 100644 index 0000000..fd59015 --- /dev/null +++ b/src/main/java/com/project/carrot/domain/ExceptionDTO.java @@ -0,0 +1,23 @@ +package com.project.carrot.domain; + +import com.project.carrot.CustomException; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@AllArgsConstructor +@Getter +public class ExceptionDTO { //예외처리 DTO 생성 + private final Boolean success; + private final HttpStatus status; + private final String code; + private final String message; + + public ExceptionDTO(CustomException e){ //예외가 발생하면 나타나는 것들 + this.success=false; + this.status=e.getErrorCode().getStatus(); + this.code=e.getErrorCode().name(); + this.message=e.getErrorCode().getMessage(); + } + +} From e4e0f7a36052b66a9d2116a3b89532131429a611 Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Fri, 3 Feb 2023 17:24:32 +0900 Subject: [PATCH 06/15] =?UTF-8?q?MemberItem=20Entity=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/project/carrot/domain/Member.java | 11 ++++++ .../com/project/carrot/domain/MemberItem.java | 37 +++++++++++++++++++ .../repository/JPAMemberItemRepository.java | 5 +++ .../repository/MemberItemRepository.java | 13 +++++++ 4 files changed, 66 insertions(+) create mode 100644 src/main/java/com/project/carrot/domain/MemberItem.java create mode 100644 src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java create mode 100644 src/main/java/com/project/carrot/repository/MemberItemRepository.java diff --git a/src/main/java/com/project/carrot/domain/Member.java b/src/main/java/com/project/carrot/domain/Member.java index e768435..d90cdca 100644 --- a/src/main/java/com/project/carrot/domain/Member.java +++ b/src/main/java/com/project/carrot/domain/Member.java @@ -34,6 +34,8 @@ public class Member implements UserDetails{ @Builder.Default private String ProfilePhotoURL=null; + + @ElementCollection(fetch = FetchType.EAGER) @Builder.Default private List roles = new ArrayList<>(); @@ -45,6 +47,10 @@ public Collection getAuthorities(){ .collect(Collectors.toList()); } + @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL) + @JoinColumn(name="UserEmail") + private Collection memberItem; + @Override public String getPassword() { return UserPass; @@ -74,6 +80,11 @@ public boolean isCredentialsNonExpired() { public boolean isEnabled() { return true; } + public void addMemberItem(MemberItem m){ + if(memberItem == null) + memberItem=new ArrayList(); + memberItem.add(m); + } // public static MemberBuilder builder(PostSaveDTO postSaveDTO) { // return new MemberBuilder() diff --git a/src/main/java/com/project/carrot/domain/MemberItem.java b/src/main/java/com/project/carrot/domain/MemberItem.java new file mode 100644 index 0000000..dece1e1 --- /dev/null +++ b/src/main/java/com/project/carrot/domain/MemberItem.java @@ -0,0 +1,37 @@ +package com.project.carrot.domain; + +import lombok.*; +import org.springframework.lang.Nullable; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Getter +@AllArgsConstructor +@NoArgsConstructor //필요할 듯 +@Entity //객체라는 것을 알림 +@ToString +@Builder +public class MemberItem { + @Id + @GeneratedValue + private int ItemId; + private String UserEmail;//외래키 + private String ItemTitle; + private String ItemContent; + private int ItemPrice; + private String ItemApplyDate; + private Boolean ItemForSale; + private String ItemLocation; + private String ItemEmphathy; + private String ItemCategory; + private String ItemSeller; + private int ItemChatting; + private int ItemViews; + @Builder.Default + private String ItemUpdated=null; + @Builder.Default + private String ItemDeleted=null; + +} \ No newline at end of file diff --git a/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java b/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java new file mode 100644 index 0000000..ae28abb --- /dev/null +++ b/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java @@ -0,0 +1,5 @@ +package com.project.carrot.repository; + +public class JPAMemberItemRepository { + +} diff --git a/src/main/java/com/project/carrot/repository/MemberItemRepository.java b/src/main/java/com/project/carrot/repository/MemberItemRepository.java new file mode 100644 index 0000000..71b03b4 --- /dev/null +++ b/src/main/java/com/project/carrot/repository/MemberItemRepository.java @@ -0,0 +1,13 @@ +package com.project.carrot.repository; + +import com.project.carrot.domain.Member; +import com.project.carrot.domain.MemberItem; + +import java.util.Optional; + +public interface MemberItemRepository { + MemberItem save(MemberItem memberItem); + Optional findById(int Id); + Optional findByName(String name); + Optional findByPass(String pass); +} \ No newline at end of file From eff8dc2801e1b2e3dd60ce6c2859e912363a36df Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Fri, 3 Feb 2023 17:58:12 +0900 Subject: [PATCH 07/15] =?UTF-8?q?JPA=20Auditing=EC=9D=84=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EC=8B=9C=EA=B0=84=20=ED=99=95=EC=9D=B8=20=EB=B0=8F?= =?UTF-8?q?=20MemberItem=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/project/carrot/CarrotApplication.java | 2 ++ .../com/project/carrot/domain/MemberItem.java | 19 ++++++++++------ .../project/carrot/domain/Timestamped.java | 22 +++++++++++++++++++ 3 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/project/carrot/domain/Timestamped.java diff --git a/src/main/java/com/project/carrot/CarrotApplication.java b/src/main/java/com/project/carrot/CarrotApplication.java index 4a00e70..9a5a5df 100644 --- a/src/main/java/com/project/carrot/CarrotApplication.java +++ b/src/main/java/com/project/carrot/CarrotApplication.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +@EnableJpaAuditing //JpaAuditing을 활성화 해주는 기능 @SpringBootApplication public class CarrotApplication { diff --git a/src/main/java/com/project/carrot/domain/MemberItem.java b/src/main/java/com/project/carrot/domain/MemberItem.java index dece1e1..4fe62d7 100644 --- a/src/main/java/com/project/carrot/domain/MemberItem.java +++ b/src/main/java/com/project/carrot/domain/MemberItem.java @@ -21,14 +21,19 @@ public class MemberItem { private String ItemTitle; private String ItemContent; private int ItemPrice; - private String ItemApplyDate; - private Boolean ItemForSale; - private String ItemLocation; - private String ItemEmphathy; + @Builder.Default + private String ItemApplyDate=null; //객체 생성 후에 JPA Auditing을 이용해서 반환할 것 + @Builder.Default + private Boolean ItemForSale=true; //올리면 판매하는 상황이기 때문에 + //private String ItemLocation; //Member에서 가져와야하는데 아직 구현하지 않았음 + @Builder.Default + private int ItemEmphathy=0; //공감을 클릭하면 올라갈 수 있게 0으로 초기화 private String ItemCategory; - private String ItemSeller; - private int ItemChatting; - private int ItemViews; + //private Member ItemSeller; //ManyToOne과 OneToMany 공부 후 결정 + @Builder.Default + private int ItemChatting=0; //채팅한 횟수 + @Builder.Default + private int ItemViews=0; //조회한 횟수 @Builder.Default private String ItemUpdated=null; @Builder.Default diff --git a/src/main/java/com/project/carrot/domain/Timestamped.java b/src/main/java/com/project/carrot/domain/Timestamped.java new file mode 100644 index 0000000..ed06a86 --- /dev/null +++ b/src/main/java/com/project/carrot/domain/Timestamped.java @@ -0,0 +1,22 @@ +package com.project.carrot.domain; + +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import java.time.LocalDate; + +@MappedSuperclass //데이터베이스에 자동으로 생성하게 도와줌 +@Getter +@EntityListeners(AuditingEntityListener.class)//생성과 변경 시간을 자동으로 업데이트 해줌 +public class Timestamped { + @CreatedDate + private LocalDate createAt; + + @LastModifiedBy + private LocalDate modifiedAt; +} +//이후 CarrotApplication에 @EnableJpaAuditing 해줘야 함 From 4bd7a504d84d077abcbaf7461e4564be03d3107c Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Fri, 3 Feb 2023 18:11:56 +0900 Subject: [PATCH 08/15] =?UTF-8?q?MemberItemRepository=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../carrot/repository/MemberItemRepository.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/project/carrot/repository/MemberItemRepository.java b/src/main/java/com/project/carrot/repository/MemberItemRepository.java index 71b03b4..b4ba36e 100644 --- a/src/main/java/com/project/carrot/repository/MemberItemRepository.java +++ b/src/main/java/com/project/carrot/repository/MemberItemRepository.java @@ -3,11 +3,15 @@ import com.project.carrot.domain.Member; import com.project.carrot.domain.MemberItem; +import java.util.List; import java.util.Optional; public interface MemberItemRepository { MemberItem save(MemberItem memberItem); - Optional findById(int Id); - Optional findByName(String name); - Optional findByPass(String pass); + List findAll(); + List findByCategory(String category); + Optional findByTitle(String title); + Optional findByContent(String content); + + } \ No newline at end of file From 574cb5eec22f2dbbbf771a5b8f92328a3f4533fa Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Sun, 5 Feb 2023 19:12:39 +0900 Subject: [PATCH 09/15] =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=99=80=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/project/carrot/MyInterceptor.java | 4 +- .../carrot/Service/MemberItemService.java | 21 +++++++ .../project/carrot/config/SecurityConfig.java | 2 +- .../project/carrot/config/SpringConfig.java | 11 +++- .../carrot/controller/JWTController.java | 2 +- .../controller/MemberItemController.java | 48 ++++++++++++++++ .../com/project/carrot/domain/ItemDTO.java | 35 ++++++++++++ .../com/project/carrot/domain/Member.java | 3 +- .../com/project/carrot/domain/MemberItem.java | 2 +- .../project/carrot/domain/PostSaveDTO.java | 4 ++ .../repository/JPAMemberItemRepository.java | 55 ++++++++++++++++++- .../repository/MemberItemRepository.java | 8 ++- src/main/resources/application.properties | 5 +- 13 files changed, 188 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/project/carrot/Service/MemberItemService.java create mode 100644 src/main/java/com/project/carrot/controller/MemberItemController.java create mode 100644 src/main/java/com/project/carrot/domain/ItemDTO.java diff --git a/src/main/java/com/project/carrot/MyInterceptor.java b/src/main/java/com/project/carrot/MyInterceptor.java index 834bb28..be64e32 100644 --- a/src/main/java/com/project/carrot/MyInterceptor.java +++ b/src/main/java/com/project/carrot/MyInterceptor.java @@ -30,7 +30,7 @@ public void afterCompletion( if (!String.valueOf(response.getStatus()).startsWith("2")) { return; } - //Json형식의 응답값만 수정 - @ResponseBody를 통해 Object반환은 JSON으로 넘어옴. + //Json 형식의 응답값만 수정 - @ResponseBody를 통해 Object 반환은 JSON으로 넘어옴. if (cachingResponse.getContentType() != null && (cachingResponse.getContentType().contains("application/json"))) { if (cachingResponse.getContentAsByteArray().length != 0) { //String 변환 ex){"key":"value"} @@ -45,7 +45,7 @@ public void afterCompletion( //String 변환 -> Byte로 쓰기 위함. String wrappedBody = objectMapper.writeValueAsString(objectResponseDTO); - //flush + //flush 버퍼에 있는 데이터를 처리함. cachingResponse.resetBuffer(); //덮어쓰기 diff --git a/src/main/java/com/project/carrot/Service/MemberItemService.java b/src/main/java/com/project/carrot/Service/MemberItemService.java new file mode 100644 index 0000000..7b36f55 --- /dev/null +++ b/src/main/java/com/project/carrot/Service/MemberItemService.java @@ -0,0 +1,21 @@ +package com.project.carrot.Service; + +import com.project.carrot.domain.MemberItem; +import com.project.carrot.repository.MemberItemRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Transactional +public class MemberItemService { + /* + * 상품 등록 페이지 구현 + * */ + + public final MemberItemRepository memberItemRepository; + + public MemberItem append(MemberItem memberItem){ + return memberItemRepository.save(memberItem); + } + +} diff --git a/src/main/java/com/project/carrot/config/SecurityConfig.java b/src/main/java/com/project/carrot/config/SecurityConfig.java index cdae12f..c1e03c2 100644 --- a/src/main/java/com/project/carrot/config/SecurityConfig.java +++ b/src/main/java/com/project/carrot/config/SecurityConfig.java @@ -33,7 +33,7 @@ protected void configure(HttpSecurity http) throws Exception { .authorizeRequests()// 요청에 대한 사용권한 체크 .antMatchers("/test").authenticated() //.antMatchers("/admin/**").hasRole("ADMIN") - //.antMatchers("/user/**").hasRole("USER") + .antMatchers("/user/**").hasRole("USER") .antMatchers("/**").permitAll() .and() .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), diff --git a/src/main/java/com/project/carrot/config/SpringConfig.java b/src/main/java/com/project/carrot/config/SpringConfig.java index a11de0d..a5abbe1 100644 --- a/src/main/java/com/project/carrot/config/SpringConfig.java +++ b/src/main/java/com/project/carrot/config/SpringConfig.java @@ -1,7 +1,10 @@ package com.project.carrot.config; +import com.project.carrot.Service.MemberItemService; import com.project.carrot.Service.MemberService; +import com.project.carrot.repository.JPAMemberItemRepository; import com.project.carrot.repository.JPAMemberRepository; +import com.project.carrot.repository.MemberItemRepository; import com.project.carrot.repository.MemberRepository; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,4 +33,10 @@ public MemberService memberService(){ public MemberRepository memberRepository(){ return new JPAMemberRepository(em); } -} + + @Bean + public MemberItemService memberItemService(){return new MemberItemService(memberItemRepository());} + + @Bean + public MemberItemRepository memberItemRepository(){return new JPAMemberItemRepository(em);} + } diff --git a/src/main/java/com/project/carrot/controller/JWTController.java b/src/main/java/com/project/carrot/controller/JWTController.java index 144b92c..a9892e8 100644 --- a/src/main/java/com/project/carrot/controller/JWTController.java +++ b/src/main/java/com/project/carrot/controller/JWTController.java @@ -45,6 +45,6 @@ public String login(@RequestBody Map user) { if(!user.get("PASS").equals(member.getPassword())) throw new IllegalArgumentException("비밀번호가 일치하지 않습니다."); - return jwtTokenProvider.createToken(member.getUsername(), member.getRoles()); + return jwtTokenProvider.createToken(member.getUserEmail(), member.getRoles()); } } diff --git a/src/main/java/com/project/carrot/controller/MemberItemController.java b/src/main/java/com/project/carrot/controller/MemberItemController.java new file mode 100644 index 0000000..802d160 --- /dev/null +++ b/src/main/java/com/project/carrot/controller/MemberItemController.java @@ -0,0 +1,48 @@ +package com.project.carrot.controller; + +import com.project.carrot.Service.MemberItemService; +import com.project.carrot.domain.*; +import com.project.carrot.repository.MemberItemRepository; +import com.project.carrot.repository.MemberRepository; +import com.project.carrot.security.JwtTokenProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@RestController +@Slf4j +@RequiredArgsConstructor +public class MemberItemController { + private final MemberItemRepository memberItemRepository; + private final MemberItemService memberItemService; + private final JwtTokenProvider jwtTokenProvider; + private final MemberRepository memberRepository; + + + @GetMapping(value = "/item") //추후에 /user/item으로 변경해서 권한 있는 사람만 가능하게 + public List showItemList() { + return memberItemRepository.findAll(); + } + + @PostMapping(value = "/itemAppend") + public MemberItem appendItem(@RequestBody ItemDTO itemDTO) { + MemberItem memberItem = itemDTO.toEntity(); + Optional member = memberItemRepository.findByUserId(itemDTO.getUSERID()); + log.info(member.get().getUserEmail()); + memberRepository.findByEmail(member.get().getUserEmail()) + .orElseThrow(() -> new IllegalArgumentException("유저 정보가 없습니다.")); + + //mypage 구현을 위해 member에 addMemberItem 추가해야함 + log.info("상품 추가"); + return memberItemRepository.save(memberItem); + } + +} diff --git a/src/main/java/com/project/carrot/domain/ItemDTO.java b/src/main/java/com/project/carrot/domain/ItemDTO.java new file mode 100644 index 0000000..a8bd790 --- /dev/null +++ b/src/main/java/com/project/carrot/domain/ItemDTO.java @@ -0,0 +1,35 @@ +package com.project.carrot.domain; + +import lombok.Builder; +import lombok.Data; + +import java.util.Collections; + +@Data +public class ItemDTO { + private Long USERID; + private String TITLE; + private String CONTENT; + private int PRICE; + private String CATEGORY; + + + @Builder + public ItemDTO(Long USERID,String TITLE,String CONTENT, int PRICE,String CATEGORY){ + this.USERID=USERID; + this.TITLE=TITLE; + this.CONTENT=CONTENT; + this.CATEGORY=CATEGORY; + this.PRICE=PRICE; + } + + public MemberItem toEntity(){ + return MemberItem.builder() + .UserId(USERID) + .ItemTitle(TITLE) + .ItemContent(CONTENT) + .ItemPrice(PRICE) + .ItemCategory(CATEGORY) + .build(); + } +} diff --git a/src/main/java/com/project/carrot/domain/Member.java b/src/main/java/com/project/carrot/domain/Member.java index d90cdca..c0af9e8 100644 --- a/src/main/java/com/project/carrot/domain/Member.java +++ b/src/main/java/com/project/carrot/domain/Member.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.*; import org.apache.catalina.User; +import org.springframework.context.annotation.Primary; import org.springframework.lang.Nullable; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; @@ -48,7 +49,7 @@ public Collection getAuthorities(){ } @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL) - @JoinColumn(name="UserEmail") + @JoinColumn(name="UserId") private Collection memberItem; @Override diff --git a/src/main/java/com/project/carrot/domain/MemberItem.java b/src/main/java/com/project/carrot/domain/MemberItem.java index 4fe62d7..28becf1 100644 --- a/src/main/java/com/project/carrot/domain/MemberItem.java +++ b/src/main/java/com/project/carrot/domain/MemberItem.java @@ -17,7 +17,7 @@ public class MemberItem { @Id @GeneratedValue private int ItemId; - private String UserEmail;//외래키 + private Long UserId; //외래키 private String ItemTitle; private String ItemContent; private int ItemPrice; diff --git a/src/main/java/com/project/carrot/domain/PostSaveDTO.java b/src/main/java/com/project/carrot/domain/PostSaveDTO.java index 39f4306..7b7aa26 100644 --- a/src/main/java/com/project/carrot/domain/PostSaveDTO.java +++ b/src/main/java/com/project/carrot/domain/PostSaveDTO.java @@ -2,6 +2,8 @@ import lombok.*; +import java.util.Collections; + @Data public class PostSaveDTO { private String EMAIL; @@ -10,6 +12,7 @@ public class PostSaveDTO { private String USERNAME; private String NICKNAME; private String ADDRESS; + //private String //final KafkaProperties.Admin ADMIN = Admin.일반회원; 권한설정 필요할 경우 설정 @@ -32,6 +35,7 @@ public Member toEntity(){ .UserName(USERNAME) .NickName(NICKNAME) .Address(ADDRESS) + .roles(Collections.singletonList("ROLE_USER")) .build(); } } diff --git a/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java b/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java index ae28abb..4b466ca 100644 --- a/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java +++ b/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java @@ -1,5 +1,58 @@ package com.project.carrot.repository; -public class JPAMemberItemRepository { +import com.project.carrot.domain.Member; +import com.project.carrot.domain.MemberItem; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; +import javax.persistence.EntityManager; +import java.util.List; +import java.util.Optional; + +public class JPAMemberItemRepository implements MemberItemRepository{ + + private final EntityManager em; + + public JPAMemberItemRepository(EntityManager em) { + this.em = em; + } + + @Transactional + @Override + //cannot reliably process 'persist' call 오류 발생으로 어노테이션 추가 + public MemberItem save(MemberItem memberItem) { + em.persist(memberItem); + return memberItem; + } + + @Override + public List findAll() { + return em.createQuery("select m from MemberItem m",MemberItem.class) + .getResultList(); + } + + @Override + public List findByCategory(String ItemCategory) { + return em.createQuery("select m from MemberItem m where ItemCategory= :ItemCategory" + ,MemberItem.class).setParameter("ItemCategory",ItemCategory).getResultList(); + } + + @Override + public List findByTitle(String ItemTitle) { + return em.createQuery("select m from MemberItem m where ItemTitle= :ItemTitle" + ,MemberItem.class).setParameter("ItemTitle",ItemTitle).getResultList(); + } + + @Override + public List findByContent(String ItemContent) { + return em.createQuery("SELECT m FROM MemberItem m WHERE m.ItemContent LIKE %:ItemContent" + ,MemberItem.class).setParameter("ItemContent",ItemContent).getResultList(); + } + + @Override + public Optional findByUserId(Long UserId){ + Member member=em.find(Member.class,UserId); + return Optional.ofNullable(member); + } } diff --git a/src/main/java/com/project/carrot/repository/MemberItemRepository.java b/src/main/java/com/project/carrot/repository/MemberItemRepository.java index b4ba36e..38cfb80 100644 --- a/src/main/java/com/project/carrot/repository/MemberItemRepository.java +++ b/src/main/java/com/project/carrot/repository/MemberItemRepository.java @@ -9,9 +9,11 @@ public interface MemberItemRepository { MemberItem save(MemberItem memberItem); List findAll(); - List findByCategory(String category); - Optional findByTitle(String title); - Optional findByContent(String content); + List findByCategory(String ItemCategory); + List findByTitle(String ItemTitle); + List findByContent(String ItemContent); + + Optional findByUserId(Long UserId); } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 91940d8..47e2904 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -14,4 +14,7 @@ spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true -#token secret key \ No newline at end of file +#token secret key + +#spring.main.allow-bean-definition-overriding=true +#bean ?? ?? ???? ???? memberRepository ?? ?? From 527badb90866d8ad36bacce04400d101cfcb399d Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Thu, 9 Feb 2023 00:13:08 +0900 Subject: [PATCH 10/15] =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C=20=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MemberItemController.java | 21 ++++++++++++------- .../com/project/carrot/domain/MemberItem.java | 2 +- .../repository/JPAMemberItemRepository.java | 6 ++++++ .../repository/MemberItemRepository.java | 2 ++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/project/carrot/controller/MemberItemController.java b/src/main/java/com/project/carrot/controller/MemberItemController.java index 802d160..2f35e8b 100644 --- a/src/main/java/com/project/carrot/controller/MemberItemController.java +++ b/src/main/java/com/project/carrot/controller/MemberItemController.java @@ -7,10 +7,7 @@ import com.project.carrot.security.JwtTokenProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.List; @@ -32,8 +29,8 @@ public List showItemList() { return memberItemRepository.findAll(); } - @PostMapping(value = "/itemAppend") - public MemberItem appendItem(@RequestBody ItemDTO itemDTO) { + @PostMapping(value = "/item/sellItem") + public MemberItem sellItem(@RequestBody ItemDTO itemDTO) { MemberItem memberItem = itemDTO.toEntity(); Optional member = memberItemRepository.findByUserId(itemDTO.getUSERID()); log.info(member.get().getUserEmail()); @@ -42,7 +39,17 @@ public MemberItem appendItem(@RequestBody ItemDTO itemDTO) { //mypage 구현을 위해 member에 addMemberItem 추가해야함 log.info("상품 추가"); - return memberItemRepository.save(memberItem); + + return memberItem; + } + + @RequestMapping(value="/item/buyItem") //URL을 통해 memberItem 반환 + public MemberItem buyItem(@RequestParam("itemId") Long id){ + log.info("인자의 값",id); + MemberItem memberItem= memberItemRepository.findByItemId(id) + .orElseThrow(() -> new IllegalArgumentException("없는 ItemID")); + + return memberItem; } } diff --git a/src/main/java/com/project/carrot/domain/MemberItem.java b/src/main/java/com/project/carrot/domain/MemberItem.java index 28becf1..79a9e4d 100644 --- a/src/main/java/com/project/carrot/domain/MemberItem.java +++ b/src/main/java/com/project/carrot/domain/MemberItem.java @@ -16,7 +16,7 @@ public class MemberItem { @Id @GeneratedValue - private int ItemId; + private Long ItemId; private Long UserId; //외래키 private String ItemTitle; private String ItemContent; diff --git a/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java b/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java index 4b466ca..aa8f6ab 100644 --- a/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java +++ b/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java @@ -50,6 +50,12 @@ public List findByContent(String ItemContent) { ,MemberItem.class).setParameter("ItemContent",ItemContent).getResultList(); } + @Override + public Optional findByItemId(Long ItemId){ + MemberItem memberItem=em.find(MemberItem.class,ItemId); + return Optional.ofNullable(memberItem); + } + @Override public Optional findByUserId(Long UserId){ Member member=em.find(Member.class,UserId); diff --git a/src/main/java/com/project/carrot/repository/MemberItemRepository.java b/src/main/java/com/project/carrot/repository/MemberItemRepository.java index 38cfb80..417323e 100644 --- a/src/main/java/com/project/carrot/repository/MemberItemRepository.java +++ b/src/main/java/com/project/carrot/repository/MemberItemRepository.java @@ -13,6 +13,8 @@ public interface MemberItemRepository { List findByTitle(String ItemTitle); List findByContent(String ItemContent); + Optional findByItemId(Long ItemId); + Optional findByUserId(Long UserId); From 3001c275e61c2b5bcabce14726ae02189999e160 Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Fri, 10 Feb 2023 15:07:27 +0900 Subject: [PATCH 11/15] =?UTF-8?q?mySellList()=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MemberItemController.java | 43 ++++++++++++++----- .../com/project/carrot/domain/Member.java | 6 +-- .../repository/JPAMemberItemRepository.java | 6 +++ .../repository/JPAMemberRepository.java | 6 ++- .../repository/MemberItemRepository.java | 3 +- .../carrot/repository/MemberRepository.java | 1 + 6 files changed, 48 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/project/carrot/controller/MemberItemController.java b/src/main/java/com/project/carrot/controller/MemberItemController.java index 2f35e8b..c9e0b41 100644 --- a/src/main/java/com/project/carrot/controller/MemberItemController.java +++ b/src/main/java/com/project/carrot/controller/MemberItemController.java @@ -32,24 +32,47 @@ public List showItemList() { @PostMapping(value = "/item/sellItem") public MemberItem sellItem(@RequestBody ItemDTO itemDTO) { MemberItem memberItem = itemDTO.toEntity(); - Optional member = memberItemRepository.findByUserId(itemDTO.getUSERID()); - log.info(member.get().getUserEmail()); - memberRepository.findByEmail(member.get().getUserEmail()) - .orElseThrow(() -> new IllegalArgumentException("유저 정보가 없습니다.")); + Member member = memberItemRepository.findByUserId(itemDTO.getUSERID()) + .orElseThrow(()-> new IllegalArgumentException("유저 정보가 없습니다.")); - //mypage 구현을 위해 member에 addMemberItem 추가해야함 + log.info(member.getUserEmail()); log.info("상품 추가"); return memberItem; } @RequestMapping(value="/item/buyItem") //URL을 통해 memberItem 반환 - public MemberItem buyItem(@RequestParam("itemId") Long id){ - log.info("인자의 값",id); - MemberItem memberItem= memberItemRepository.findByItemId(id) - .orElseThrow(() -> new IllegalArgumentException("없는 ItemID")); + public class ItemPage { + @GetMapping + public MemberItem buyItemPage(@RequestParam("itemId") Long id) { + log.info("인자의 값", id); + MemberItem memberItem = memberItemRepository.findByItemId(id) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 ItemID")); - return memberItem; + return memberItem; + } + /* @PostMapping + public MemberItem buyItem(@RequestParam("itemId") Long id){ + MemberItem memberItem = memberItemRepository.findByItemId(id) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 ItemID")); + + if(memberItem.getItemForSale()==false) + throw new RuntimeException(); + + + } +*/ + + } + @GetMapping(value="/mypage/sellItem") + public List mySellList(@RequestParam("userId") Long id){ + Member member=memberRepository.findById(id) + .orElseThrow(()->new IllegalArgumentException("유저 정보가 존재하지 않습니다.")); + log.info("member",member.getUserId()); + List memberItemList = memberItemRepository.findAllByUserId(member.getUserId()); + log.info("memberItem", memberItemRepository.findByUserId(member.getUserId())); + + return memberItemList; } } diff --git a/src/main/java/com/project/carrot/domain/Member.java b/src/main/java/com/project/carrot/domain/Member.java index c0af9e8..418153e 100644 --- a/src/main/java/com/project/carrot/domain/Member.java +++ b/src/main/java/com/project/carrot/domain/Member.java @@ -37,6 +37,7 @@ public class Member implements UserDetails{ + @ElementCollection(fetch = FetchType.EAGER) @Builder.Default private List roles = new ArrayList<>(); @@ -81,11 +82,6 @@ public boolean isCredentialsNonExpired() { public boolean isEnabled() { return true; } - public void addMemberItem(MemberItem m){ - if(memberItem == null) - memberItem=new ArrayList(); - memberItem.add(m); - } // public static MemberBuilder builder(PostSaveDTO postSaveDTO) { // return new MemberBuilder() diff --git a/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java b/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java index aa8f6ab..5485e16 100644 --- a/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java +++ b/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java @@ -61,4 +61,10 @@ public Optional findByUserId(Long UserId){ Member member=em.find(Member.class,UserId); return Optional.ofNullable(member); } + + @Override + public List findAllByUserId(Long UserId){ + return em.createQuery("select m from MemberItem m where UserId= :UserId" + ,MemberItem.class).setParameter("UserId",UserId).getResultList(); + } } diff --git a/src/main/java/com/project/carrot/repository/JPAMemberRepository.java b/src/main/java/com/project/carrot/repository/JPAMemberRepository.java index 0cdf0ea..60d32b4 100644 --- a/src/main/java/com/project/carrot/repository/JPAMemberRepository.java +++ b/src/main/java/com/project/carrot/repository/JPAMemberRepository.java @@ -18,7 +18,11 @@ public Member save(Member member) { em.persist(member); return member; } - + @Override + public Optional findById(Long Userid){ + Member member=em.find(Member.class,Userid); + return Optional.ofNullable(member); + } @Override public Optional findByEmail(String UserEmail) { List result = em.createQuery("select m from Member m where UserEmail= :UserEmail" diff --git a/src/main/java/com/project/carrot/repository/MemberItemRepository.java b/src/main/java/com/project/carrot/repository/MemberItemRepository.java index 417323e..d69255c 100644 --- a/src/main/java/com/project/carrot/repository/MemberItemRepository.java +++ b/src/main/java/com/project/carrot/repository/MemberItemRepository.java @@ -14,8 +14,9 @@ public interface MemberItemRepository { List findByContent(String ItemContent); Optional findByItemId(Long ItemId); - Optional findByUserId(Long UserId); + List findAllByUserId(Long UserId); + } \ No newline at end of file diff --git a/src/main/java/com/project/carrot/repository/MemberRepository.java b/src/main/java/com/project/carrot/repository/MemberRepository.java index db1fb33..74463da 100644 --- a/src/main/java/com/project/carrot/repository/MemberRepository.java +++ b/src/main/java/com/project/carrot/repository/MemberRepository.java @@ -8,6 +8,7 @@ public interface MemberRepository{ Member save(Member member); + Optional findById(Long Id); Optional findByEmail(String email); Optional findByName(String name); Optional findByPass(String pass); From 62437a5bdb56d1f0e0ba52dfd5148baf7496a4d8 Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Fri, 10 Feb 2023 17:05:25 +0900 Subject: [PATCH 12/15] =?UTF-8?q?=ED=98=84=EC=9E=AC=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=98=A4=EB=A5=98=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../carrot/Service/MemberItemService.java | 11 ++++- .../controller/MemberItemController.java | 40 ++++++++++--------- .../com/project/carrot/domain/Member.java | 4 -- .../com/project/carrot/domain/MemberItem.java | 2 +- 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/project/carrot/Service/MemberItemService.java b/src/main/java/com/project/carrot/Service/MemberItemService.java index 7b36f55..34450f8 100644 --- a/src/main/java/com/project/carrot/Service/MemberItemService.java +++ b/src/main/java/com/project/carrot/Service/MemberItemService.java @@ -1,12 +1,12 @@ package com.project.carrot.Service; +import com.project.carrot.domain.Member; import com.project.carrot.domain.MemberItem; import com.project.carrot.repository.MemberItemRepository; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor -@Transactional public class MemberItemService { /* * 상품 등록 페이지 구현 @@ -14,8 +14,17 @@ public class MemberItemService { public final MemberItemRepository memberItemRepository; + @Transactional public MemberItem append(MemberItem memberItem){ return memberItemRepository.save(memberItem); } + @Transactional + public MemberItem saled(Long id){ + MemberItem memberItem=memberItemRepository.findByItemId(id) + .orElseThrow(()->new RuntimeException("존재하지 않는 유저입니다.")); + memberItem=memberItem.toBuilder().ItemForSale(false).build(); + System.out.println(memberItem.toString()); + return memberItemRepository.save(memberItem); + } } diff --git a/src/main/java/com/project/carrot/controller/MemberItemController.java b/src/main/java/com/project/carrot/controller/MemberItemController.java index c9e0b41..8e0b513 100644 --- a/src/main/java/com/project/carrot/controller/MemberItemController.java +++ b/src/main/java/com/project/carrot/controller/MemberItemController.java @@ -5,8 +5,10 @@ import com.project.carrot.repository.MemberItemRepository; import com.project.carrot.repository.MemberRepository; import com.project.carrot.security.JwtTokenProvider; +import lombok.Builder; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.jpa.repository.Query; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -42,28 +44,30 @@ public MemberItem sellItem(@RequestBody ItemDTO itemDTO) { } @RequestMapping(value="/item/buyItem") //URL을 통해 memberItem 반환 - public class ItemPage { - @GetMapping - public MemberItem buyItemPage(@RequestParam("itemId") Long id) { - log.info("인자의 값", id); - MemberItem memberItem = memberItemRepository.findByItemId(id) - .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 ItemID")); - - return memberItem; - } - /* @PostMapping - public MemberItem buyItem(@RequestParam("itemId") Long id){ - MemberItem memberItem = memberItemRepository.findByItemId(id) - .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 ItemID")); - - if(memberItem.getItemForSale()==false) - throw new RuntimeException(); + public MemberItem buyItemPage(@RequestParam("itemId") Long id) { + log.info("인자의 값", id); + MemberItem memberItem = memberItemRepository.findByItemId(id) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 ItemID")); + return memberItem; + } + @PostMapping(value = "/item/buyItem") + public MemberItem buyItem(@RequestParam("itemId") Long id){ + MemberItem memberItem = memberItemRepository.findByItemId(id) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 ItemID")); + System.out.println(memberItem.getItemForSale()); + try { + if (memberItem.getItemForSale() == false) { + throw new Exception(); + } } -*/ - + catch (Exception e){ + e.getMessage(); + } + return memberItemService.saled(memberItem.getItemId()); } + @GetMapping(value="/mypage/sellItem") public List mySellList(@RequestParam("userId") Long id){ Member member=memberRepository.findById(id) diff --git a/src/main/java/com/project/carrot/domain/Member.java b/src/main/java/com/project/carrot/domain/Member.java index 418153e..06e208b 100644 --- a/src/main/java/com/project/carrot/domain/Member.java +++ b/src/main/java/com/project/carrot/domain/Member.java @@ -35,9 +35,6 @@ public class Member implements UserDetails{ @Builder.Default private String ProfilePhotoURL=null; - - - @ElementCollection(fetch = FetchType.EAGER) @Builder.Default private List roles = new ArrayList<>(); @@ -50,7 +47,6 @@ public Collection getAuthorities(){ } @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL) - @JoinColumn(name="UserId") private Collection memberItem; @Override diff --git a/src/main/java/com/project/carrot/domain/MemberItem.java b/src/main/java/com/project/carrot/domain/MemberItem.java index 79a9e4d..16b01a6 100644 --- a/src/main/java/com/project/carrot/domain/MemberItem.java +++ b/src/main/java/com/project/carrot/domain/MemberItem.java @@ -12,7 +12,7 @@ @NoArgsConstructor //필요할 듯 @Entity //객체라는 것을 알림 @ToString -@Builder +@Builder(toBuilder = true) public class MemberItem { @Id @GeneratedValue From 1c494b54a9a613f7bf4a2b6c1b01921ce881d966 Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Sun, 12 Feb 2023 19:35:46 +0900 Subject: [PATCH 13/15] =?UTF-8?q?=EB=A7=A4=ED=95=91=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EB=B0=8F=20=EB=A7=88=EC=9D=B4=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../carrot/Service/MemberItemService.java | 8 ++++-- .../controller/MemberItemController.java | 28 ++++++++----------- .../com/project/carrot/domain/ItemDTO.java | 9 +++++- .../com/project/carrot/domain/MemberItem.java | 16 +++++++---- src/main/resources/application.properties | 2 ++ 5 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/project/carrot/Service/MemberItemService.java b/src/main/java/com/project/carrot/Service/MemberItemService.java index 34450f8..7e5545f 100644 --- a/src/main/java/com/project/carrot/Service/MemberItemService.java +++ b/src/main/java/com/project/carrot/Service/MemberItemService.java @@ -1,6 +1,6 @@ package com.project.carrot.Service; -import com.project.carrot.domain.Member; +import com.project.carrot.domain.ItemDTO; import com.project.carrot.domain.MemberItem; import com.project.carrot.repository.MemberItemRepository; import lombok.RequiredArgsConstructor; @@ -23,8 +23,10 @@ public MemberItem append(MemberItem memberItem){ public MemberItem saled(Long id){ MemberItem memberItem=memberItemRepository.findByItemId(id) .orElseThrow(()->new RuntimeException("존재하지 않는 유저입니다.")); - memberItem=memberItem.toBuilder().ItemForSale(false).build(); + //memberItem=memberItem.toBuilder().ItemForSale(false).build(); + memberItem.update(false); + System.out.println(memberItem.toString()); - return memberItemRepository.save(memberItem); + return memberItem; } } diff --git a/src/main/java/com/project/carrot/controller/MemberItemController.java b/src/main/java/com/project/carrot/controller/MemberItemController.java index 8e0b513..c617386 100644 --- a/src/main/java/com/project/carrot/controller/MemberItemController.java +++ b/src/main/java/com/project/carrot/controller/MemberItemController.java @@ -1,20 +1,16 @@ package com.project.carrot.controller; +import com.project.carrot.MyInterceptor; import com.project.carrot.Service.MemberItemService; import com.project.carrot.domain.*; import com.project.carrot.repository.MemberItemRepository; import com.project.carrot.repository.MemberRepository; import com.project.carrot.security.JwtTokenProvider; -import lombok.Builder; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.jpa.repository.Query; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; import java.util.List; -import java.util.Map; -import java.util.Optional; @RestController @Slf4j @@ -31,16 +27,17 @@ public List showItemList() { return memberItemRepository.findAll(); } + @PostMapping(value = "/item/sellItem") public MemberItem sellItem(@RequestBody ItemDTO itemDTO) { MemberItem memberItem = itemDTO.toEntity(); - Member member = memberItemRepository.findByUserId(itemDTO.getUSERID()) - .orElseThrow(()-> new IllegalArgumentException("유저 정보가 없습니다.")); - + Member member = memberItemRepository.findByUserId(memberItem.getUserId()) + .orElseThrow(()-> new IllegalArgumentException("유저 정보가 없습니다.")); + log.info(member.getUserEmail()); log.info("상품 추가"); - return memberItem; + return memberItemRepository.save(memberItem); } @RequestMapping(value="/item/buyItem") //URL을 통해 memberItem 반환 @@ -53,30 +50,29 @@ public MemberItem buyItemPage(@RequestParam("itemId") Long id) { } @PostMapping(value = "/item/buyItem") - public MemberItem buyItem(@RequestParam("itemId") Long id){ + public MemberItem buyItem(@RequestParam("itemId") Long id) { MemberItem memberItem = memberItemRepository.findByItemId(id) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 ItemID")); - System.out.println(memberItem.getItemForSale()); try { - if (memberItem.getItemForSale() == false) { - throw new Exception(); + if (!memberItem.getItemForSale()) { + log.info("이미 판매된 상품입니다."); } } catch (Exception e){ e.getMessage(); } - return memberItemService.saled(memberItem.getItemId()); + return memberItemService.saled(id); } + //mypage @GetMapping(value="/mypage/sellItem") public List mySellList(@RequestParam("userId") Long id){ Member member=memberRepository.findById(id) - .orElseThrow(()->new IllegalArgumentException("유저 정보가 존재하지 않습니다.")); + .orElseThrow(()->new IllegalArgumentException("유저 정보가 존재하지 않습니다.")); log.info("member",member.getUserId()); List memberItemList = memberItemRepository.findAllByUserId(member.getUserId()); log.info("memberItem", memberItemRepository.findByUserId(member.getUserId())); return memberItemList; } - } diff --git a/src/main/java/com/project/carrot/domain/ItemDTO.java b/src/main/java/com/project/carrot/domain/ItemDTO.java index a8bd790..eb910eb 100644 --- a/src/main/java/com/project/carrot/domain/ItemDTO.java +++ b/src/main/java/com/project/carrot/domain/ItemDTO.java @@ -1,9 +1,9 @@ package com.project.carrot.domain; +import com.project.carrot.repository.MemberItemRepository; import lombok.Builder; import lombok.Data; -import java.util.Collections; @Data public class ItemDTO { @@ -12,6 +12,11 @@ public class ItemDTO { private String CONTENT; private int PRICE; private String CATEGORY; + private Member member; + @Builder.Default + private boolean ITEMFORSALE=true; + + private MemberItemRepository memberItemRepository; @Builder @@ -30,6 +35,8 @@ public MemberItem toEntity(){ .ItemContent(CONTENT) .ItemPrice(PRICE) .ItemCategory(CATEGORY) + //.member(memberItemRepository.findByUserId(USERID).orElseThrow(()->new RuntimeException("존재하지 않는 member"))) .build(); } + } diff --git a/src/main/java/com/project/carrot/domain/MemberItem.java b/src/main/java/com/project/carrot/domain/MemberItem.java index 16b01a6..baf5c46 100644 --- a/src/main/java/com/project/carrot/domain/MemberItem.java +++ b/src/main/java/com/project/carrot/domain/MemberItem.java @@ -3,21 +3,18 @@ import lombok.*; import org.springframework.lang.Nullable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import javax.persistence.*; @Getter @AllArgsConstructor @NoArgsConstructor //필요할 듯 @Entity //객체라는 것을 알림 @ToString -@Builder(toBuilder = true) +@Builder public class MemberItem { @Id @GeneratedValue private Long ItemId; - private Long UserId; //외래키 private String ItemTitle; private String ItemContent; private int ItemPrice; @@ -38,5 +35,14 @@ public class MemberItem { private String ItemUpdated=null; @Builder.Default private String ItemDeleted=null; + //@Column(name="UserId",insertable = false,updatable = false) + private Long UserId; + //@ManyToOne + //@JoinColumn(name="UserId",referencedColumnName = "UserId") //외래키 + //private Member member; //외래키 + + public void update(boolean ItemForSale){ + this.ItemForSale=ItemForSale; + } } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 47e2904..7ceb73a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -14,6 +14,8 @@ spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true +spring.jpa.generate-ddl=true + #token secret key #spring.main.allow-bean-definition-overriding=true From d6bc3123dfbd271efb67c0ec43fbfc5f6fb2c781 Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Sun, 12 Feb 2023 21:00:55 +0900 Subject: [PATCH 14/15] =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20myBuyList(),=20buyItem()=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../carrot/Service/MemberItemService.java | 6 +++--- .../controller/MemberItemController.java | 20 +++++++++++++++---- .../com/project/carrot/domain/MemberItem.java | 8 ++++---- .../repository/JPAMemberItemRepository.java | 5 +++++ .../repository/MemberItemRepository.java | 1 + 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/project/carrot/Service/MemberItemService.java b/src/main/java/com/project/carrot/Service/MemberItemService.java index 7e5545f..5d87ba9 100644 --- a/src/main/java/com/project/carrot/Service/MemberItemService.java +++ b/src/main/java/com/project/carrot/Service/MemberItemService.java @@ -20,11 +20,11 @@ public MemberItem append(MemberItem memberItem){ } @Transactional - public MemberItem saled(Long id){ - MemberItem memberItem=memberItemRepository.findByItemId(id) + public MemberItem saled(Long itemId, Long userId){ + MemberItem memberItem=memberItemRepository.findByItemId(itemId) .orElseThrow(()->new RuntimeException("존재하지 않는 유저입니다.")); //memberItem=memberItem.toBuilder().ItemForSale(false).build(); - memberItem.update(false); + memberItem.update(false,userId); System.out.println(memberItem.toString()); return memberItem; diff --git a/src/main/java/com/project/carrot/controller/MemberItemController.java b/src/main/java/com/project/carrot/controller/MemberItemController.java index c617386..cb6f4c2 100644 --- a/src/main/java/com/project/carrot/controller/MemberItemController.java +++ b/src/main/java/com/project/carrot/controller/MemberItemController.java @@ -33,7 +33,7 @@ public MemberItem sellItem(@RequestBody ItemDTO itemDTO) { MemberItem memberItem = itemDTO.toEntity(); Member member = memberItemRepository.findByUserId(memberItem.getUserId()) .orElseThrow(()-> new IllegalArgumentException("유저 정보가 없습니다.")); - + log.info(member.getUserEmail()); log.info("상품 추가"); @@ -50,7 +50,7 @@ public MemberItem buyItemPage(@RequestParam("itemId") Long id) { } @PostMapping(value = "/item/buyItem") - public MemberItem buyItem(@RequestParam("itemId") Long id) { + public MemberItem buyItem(@RequestParam("itemId") Long id,@RequestBody PostSaveDTO postSaveDTO) { MemberItem memberItem = memberItemRepository.findByItemId(id) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 ItemID")); try { @@ -61,7 +61,10 @@ public MemberItem buyItem(@RequestParam("itemId") Long id) { catch (Exception e){ e.getMessage(); } - return memberItemService.saled(id); + Member member=memberRepository.findByEmail(postSaveDTO.getEMAIL()) + .orElseThrow(()->new RuntimeException("유저 정보가 존재하지 않습니다.")); + + return memberItemService.saled(id, memberItem.getUserId()); } //mypage @@ -71,7 +74,16 @@ public List mySellList(@RequestParam("userId") Long id){ .orElseThrow(()->new IllegalArgumentException("유저 정보가 존재하지 않습니다.")); log.info("member",member.getUserId()); List memberItemList = memberItemRepository.findAllByUserId(member.getUserId()); - log.info("memberItem", memberItemRepository.findByUserId(member.getUserId())); + + return memberItemList; + } + + @GetMapping(value="/mypage/buyItem") + public List myBuyList(@RequestParam("userId") Long id) { + Member member = memberRepository.findById(id) + .orElseThrow(() -> new RuntimeException("유저 정보가 존재하지 않습니다.")); + log.info("member",member.getUserId()); + List memberItemList = memberItemRepository.findAllByBuyUserId(member.getUserId()); return memberItemList; } diff --git a/src/main/java/com/project/carrot/domain/MemberItem.java b/src/main/java/com/project/carrot/domain/MemberItem.java index baf5c46..5d29c5d 100644 --- a/src/main/java/com/project/carrot/domain/MemberItem.java +++ b/src/main/java/com/project/carrot/domain/MemberItem.java @@ -37,12 +37,12 @@ public class MemberItem { private String ItemDeleted=null; //@Column(name="UserId",insertable = false,updatable = false) private Long UserId; - //@ManyToOne - //@JoinColumn(name="UserId",referencedColumnName = "UserId") //외래키 - //private Member member; //외래키 + @Builder.Default + private Long BuyUserId=null; - public void update(boolean ItemForSale){ + public void update(boolean ItemForSale, Long BuyUserId){ this.ItemForSale=ItemForSale; + this.BuyUserId=BuyUserId; } } \ No newline at end of file diff --git a/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java b/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java index 5485e16..9c63e4e 100644 --- a/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java +++ b/src/main/java/com/project/carrot/repository/JPAMemberItemRepository.java @@ -67,4 +67,9 @@ public List findAllByUserId(Long UserId){ return em.createQuery("select m from MemberItem m where UserId= :UserId" ,MemberItem.class).setParameter("UserId",UserId).getResultList(); } + @Override + public List findAllByBuyUserId(Long BuyUserId){ + return em.createQuery("select m from MemberItem m where BuyUserId= :BuyUserId" + ,MemberItem.class).setParameter("BuyUserId",BuyUserId).getResultList(); + } } diff --git a/src/main/java/com/project/carrot/repository/MemberItemRepository.java b/src/main/java/com/project/carrot/repository/MemberItemRepository.java index d69255c..6ec42e9 100644 --- a/src/main/java/com/project/carrot/repository/MemberItemRepository.java +++ b/src/main/java/com/project/carrot/repository/MemberItemRepository.java @@ -16,6 +16,7 @@ public interface MemberItemRepository { Optional findByItemId(Long ItemId); Optional findByUserId(Long UserId); List findAllByUserId(Long UserId); + List findAllByBuyUserId(Long BuyUserId); From 826358833245faffebdb22daf2dde13af7184101 Mon Sep 17 00:00:00 2001 From: YunTaeHyeon Date: Sun, 26 Feb 2023 19:08:41 +0900 Subject: [PATCH 15/15] findId(), findPassword() --- .../carrot/controller/JWTController.java | 24 ++++++++++++++++++- .../repository/JPAMemberRepository.java | 8 +++++++ .../carrot/repository/MemberRepository.java | 1 + 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/project/carrot/controller/JWTController.java b/src/main/java/com/project/carrot/controller/JWTController.java index a9892e8..fdacd13 100644 --- a/src/main/java/com/project/carrot/controller/JWTController.java +++ b/src/main/java/com/project/carrot/controller/JWTController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import java.util.Map; +import java.util.Optional; @Slf4j //로깅할때 쓰는 어노테이션 @@ -47,4 +48,25 @@ public String login(@RequestBody Map user) { return jwtTokenProvider.createToken(member.getUserEmail(), member.getRoles()); } -} + @PostMapping(value = "/findId") + public String findId(@RequestBody Map userTel) { + Member member = memberRepository.findByUserTel(userTel.get("userTel")) + .orElseThrow(() -> new IllegalArgumentException("계정이 존재하지 않습니다.")); + + return member.getUserEmail(); + } + + @PostMapping(value = "/findPassword")//전화번호와 이메일을 입력 + public String findPassword(@RequestBody Map userInfo){ + Member member1=memberRepository.findByUserTel(userInfo.get("userTel")) + .orElseThrow(()->new RuntimeException("계정이 존재하지 않습니다.")); + + Member member2=memberRepository.findByEmail(userInfo.get("Email")) + .orElseThrow(()->new RuntimeException("계정이 존재하지 않습니다.")); + + if(!member1.equals(member2)) + throw new RuntimeException("계정이 존재하지 않습니다."); + + return member1.getPassword(); + } +} \ No newline at end of file diff --git a/src/main/java/com/project/carrot/repository/JPAMemberRepository.java b/src/main/java/com/project/carrot/repository/JPAMemberRepository.java index 60d32b4..c491bf2 100644 --- a/src/main/java/com/project/carrot/repository/JPAMemberRepository.java +++ b/src/main/java/com/project/carrot/repository/JPAMemberRepository.java @@ -45,5 +45,13 @@ public Optional findByPass(String UserPass) { return result.stream().findAny(); } + @Override + public Optional findByUserTel(String UserTel) { + List result = em.createQuery("select m from Member m where UserTel= :UserTel" + , Member.class).setParameter("UserTel",UserTel).getResultList(); + + return result.stream().findAny(); + } + } diff --git a/src/main/java/com/project/carrot/repository/MemberRepository.java b/src/main/java/com/project/carrot/repository/MemberRepository.java index 74463da..c427b50 100644 --- a/src/main/java/com/project/carrot/repository/MemberRepository.java +++ b/src/main/java/com/project/carrot/repository/MemberRepository.java @@ -12,4 +12,5 @@ public interface MemberRepository{ Optional findByEmail(String email); Optional findByName(String name); Optional findByPass(String pass); + Optional findByUserTel(String UserTel); }