Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
45211c7
chore: yml 내 데이터베이스에 연동
jabell0310 Jun 3, 2024
e192196
chore: build.gradle에 AOP, Lombok dependencies 추가
jabell0310 Jun 3, 2024
a7c8dc9
refactor: Entity 객체에 Lombok 적용
jabell0310 Jun 3, 2024
33326af
feat: 에러 응답 객체 생성
jabell0310 Jun 3, 2024
3ce3fc3
feat: 에러 열거형 객체 생성
jabell0310 Jun 3, 2024
f3a2bfc
feat: 사용자 정의 예외 생성
jabell0310 Jun 3, 2024
58fb4db
feat: AOP를 활용한 전역 예외 처리 객체 생성
jabell0310 Jun 3, 2024
d7e977c
feat: authorId 필드 추가
jabell0310 Jun 3, 2024
0b8bab0
feat: getById()에서 조회 실패로 발생하는 예외를 null 값으로 처리
jabell0310 Jun 3, 2024
c8d1a4e
feat: 비즈니스 로직에 사용자 예외 발생 부분 추가
jabell0310 Jun 3, 2024
733ebcc
fix: gitignore에 application.yml 추가
jabell0310 Jun 23, 2024
e1eb6e7
fix: status와 code의 자료형 수정
jabell0310 Jun 23, 2024
cfb4ea0
fix: 전역예외처리 메서드 자바 컨벤션에 맞게 수정
jabell0310 Jun 25, 2024
18e2fd3
fix: yml 파일 jpa 속성 추가
jabell0310 Jun 25, 2024
eca08d9
fix: Entity 객체 Mysql 테이블과 매핑
jabell0310 Jun 25, 2024
745fc8f
fix: Repository 객체 JPA의 EntityManager를 사용하여 대체
jabell0310 Jun 25, 2024
07ee75c
fix: 클래스 이름 Jpa로 수정
jabell0310 Jun 25, 2024
a66e562
test: 영속성 컨텍스트를 활용한 CRUD 테스트 코드 추가
jabell0310 Jun 25, 2024
3688fb6
feat: 연관 관계 및 영속성 전이, 고아 객체 개념 적용
jabell0310 Jul 1, 2024
4904efa
refactor: Spring Data JPA를 사용하여 기존 코드 보완
jabell0310 Jul 1, 2024
378413f
refactor: 사용하지 않는 Test 코드 삭제
jabell0310 Jul 1, 2024
01f368b
error: 오류 미해결
jabell0310 Jul 10, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ bin/
out/
!**/src/main/**/out/
!**/src/test/**/out/
src/main/resources/application.yml

### NetBeans ###
/nbproject/private/
Expand Down
6 changes: 6 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,17 @@ repositories {
}

dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.mysql:mysql-connector-j'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
}

tasks.named('test') {
Expand Down
54 changes: 54 additions & 0 deletions src/main/java/com/example/demo/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.example.demo.config;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;


@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((auth) -> auth
.requestMatchers("/members/home","/members/register","/members/signup", "/members/view","/members/signin").permitAll()
.requestMatchers("/members/admin").hasRole("ADMIN")
.requestMatchers("/my/**").hasAnyRole("ADMIN", "USER")
.anyRequest().authenticated()
);

http
.formLogin((auth) -> auth.loginPage("/members/signin")
.loginProcessingUrl("/members/view")
.permitAll()
);

http
.csrf(AbstractHttpConfigurer::disable);

http
.sessionManagement((auth)-> auth
.maximumSessions(1)
.maxSessionsPreventsLogin(true));

http
.sessionManagement((auth)-> auth
.sessionFixation().changeSessionId());

return http.build();
}

@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}

}
59 changes: 59 additions & 0 deletions src/main/java/com/example/demo/controller/SignController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.example.demo.controller;

import com.example.demo.controller.dto.request.MemberCreateRequest;
import com.example.demo.controller.dto.response.MemberResponse;
import com.example.demo.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class SignController {

private final MemberService memberService;

@Autowired
public SignController(MemberService memberService) {
this.memberService = memberService;
}

@PostMapping("/members/register")
public String register(MemberCreateRequest request) {
MemberResponse response = memberService.create(request);
ResponseEntity.ok(response);
return "redirect:/members/signin";
}

@PostMapping("/members/view")
public String login() {
return "redirect:/members/home";
}

@GetMapping("/members/signup")
public String signUp() {
return "signup";
}

@GetMapping("/members/signin")
public String signIn() {
return "signin";
}

@GetMapping("/members/home")
public String home(Model model) {
String id = SecurityContextHolder.getContext().getAuthentication().getName();

model.addAttribute("id", id);
return "home";
}

@GetMapping("/members/admin")
public String admin() {
return "admin";
}

}
57 changes: 57 additions & 0 deletions src/main/java/com/example/demo/controller/dto/MemberDetails.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.example.demo.controller.dto;

import com.example.demo.domain.Member;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.ArrayList;
import java.util.Collection;

public class MemberDetails implements UserDetails {

private final Member member;


public MemberDetails(Member member) {
this.member = member;
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> collection = new ArrayList<>();

collection.add((GrantedAuthority) member::getRole);

return collection;
}

@Override
public String getPassword() {
return member.getPassword();
}

@Override
public String getUsername() {
return member.getUsername();
}

@Override
public boolean isAccountNonExpired() {
return true;
}

@Override
public boolean isAccountNonLocked() {
return true;
}

@Override
public boolean isCredentialsNonExpired() {
return true;
}

@Override
public boolean isEnabled() {
return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.example.demo.controller.dto.request;

public record ArticleUpdateRequest(
Long authorId,
Long boardId,
String title,
String description
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@

public record MemberResponse(
Long id,
String name,
String username,
String email
) {

public static MemberResponse from(Member member) {
return new MemberResponse(member.getId(), member.getName(), member.getEmail());
return new MemberResponse(member.getId(), member.getUsername(), member.getEmail());
}

}
63 changes: 29 additions & 34 deletions src/main/java/com/example/demo/domain/Article.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,46 @@
package com.example.demo.domain;

import jakarta.persistence.*;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDateTime;

@Entity
@Table(name = "article")
@NoArgsConstructor
@Getter
@Setter
public class Article {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "author_id", nullable = false)
private Long authorId;

@Column(name = "board_id", nullable = false)
private Long boardId;

@Column(name = "title", nullable = false)
private String title;

@Column(name = "content", nullable = false)
private String content;

@Column(name = "created_date")
private LocalDateTime createdAt;

@Column(name = "modified_date")
private LocalDateTime modifiedAt;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "board_id", insertable = false, updatable = false)
private Board board;

public Article(
Long id,
Long authorId,
Expand Down Expand Up @@ -47,39 +76,5 @@ public void update(Long boardId, String title, String description) {
this.modifiedAt = LocalDateTime.now();
}

public void setId(Long id) {
this.id = id;
}

public void setModifiedAt(LocalDateTime modifiedAt) {
this.modifiedAt = modifiedAt;
}

public Long getId() {
return id;
}

public Long getAuthorId() {
return authorId;
}

public Long getBoardId() {
return boardId;
}

public String getTitle() {
return title;
}

public String getContent() {
return content;
}

public LocalDateTime getCreatedAt() {
return createdAt;
}

public LocalDateTime getModifiedAt() {
return modifiedAt;
}
}
32 changes: 20 additions & 12 deletions src/main/java/com/example/demo/domain/Board.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,30 @@
package com.example.demo.domain;

import jakarta.persistence.*;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "board")
@NoArgsConstructor
@Getter @Setter
public class Board {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

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

@OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Article> articles = new ArrayList<>();

public Board(Long id, String name) {
this.id = id;
this.name = name;
Expand All @@ -14,18 +34,6 @@ public Board(String name) {
this.name = name;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void update(String name) {
this.name = name;
}
Expand Down
Loading