plugins {
id 'java'
id 'org.springframework.boot' version '3.1.1'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.myproject'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-oauth2-client', version: '3.1.0'
// querydsl
//querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
tasks.named('test') {
useJUnitPlatform()
}
def querydslSrcDir = 'src/main/generated'
clean {
delete file(querydslSrcDir)
}
tasks.withType(JavaCompile) {
options.generatedSourceOutputDirectory = file(querydslSrcDir)
}
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/plogging?serverTimezone=Asia/Seoul
username: cos
password: cos1234
jpa:
hibernate:
ddl-auto: create
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
properties:
show-sql: true
hibernate:
format_sql: true
dialect: org.hibernate.dialect.MySQL8Dialect
security:
oauth2:
client:
registration:
google:
client-id: 발급받은 아이디
client-secret: 발급받은 비밀번호
scope:
- email
- profile
처음에 ui만 만들면서 아 이거 연관관계들 설정은 어떻게 하지..? 하던 걱정은 조금 쓸모없는 것이었다. 테이블 다 만들고 erd클라우드 사용해서 외래키들 설정같은 거 생각해보니 금방 정리 됐다.
@Entity
@Table(name = "users")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class User {
@Id
@GeneratedValue
@Column(name ="user_no")
private Long id;
@Column(name = "user_id")
private String userId;
private String username;
private String nickname;
private String password;
private String email;
private String phone;
private String address;
@CreationTimestamp
@Column(name = "enjoy_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private LocalDateTime enjoyDate;
@Builder
public User(String userId, String username, String nickname, String password, String email, String phone, String address) {
this.userId = userId;
this.username = username;
this.nickname = nickname;
this.password = password;
this.email = email;
this.phone = phone;
this.address = address;
}
@OneToMany(mappedBy = "user")
private List<Meeting> meetingList = new ArrayList<>();
@OneToMany(mappedBy = "user")
private List<PhotoList> photoList = new ArrayList<>();
@OneToMany(mappedBy = "user")
private List<Marker> markerList = new ArrayList<>();
@OneToMany(mappedBy = "user")
private List<BeforeList> beforeLists = new ArrayList<>();
@OneToMany(mappedBy = "user")
private List<ChatText> chatTextsList = new ArrayList<>();
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class PhotoList {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "photo_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_no")
private User user;
private String image;
@Column
private Integer likes;
@Column(name="upload_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
@CreationTimestamp
private LocalDateTime uploadDate;
@Column(name ="modify_date")
@UpdateTimestamp
private LocalDateTime modifyDate;
@Column(columnDefinition = "tinyint(1) default 0")
private boolean deleted;
대충 이런 식으로 연관관계들을 설정해뒀다. PhotoList와 User로 보자면 PhotoList가 User_no를 외래키로 갖고 있기 때문에 연관관계의 주인이 된다. 때문에 Photolist는 @ManyToOne으로 User는 @OneToMany 어노테이션을 사용해 매핑했다.
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@RequiredArgsConstructor
public class WebSecurityConfig{
private final PrincipleOauth2UserService principleOauth2UserService;
private final CustomBcryptEncoder bcryptEncoder;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf((csrf) -> csrf.disable());
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers("/user/**").authenticated()
.anyRequest().permitAll()
).formLogin(formLogin ->
formLogin.loginPage("/loginForm")
.loginProcessingUrl("/login")
.defaultSuccessUrl("/")
.permitAll())
.oauth2Login(oauth2Login -> oauth2Login.loginPage("/loginForm")
.userInfoEndpoint(userInfoEndpointConfig ->
userInfoEndpointConfig.userService(principleOauth2UserService))
);
return http.build();
}
}
오늘은.. 여기까지..
상세한 내용은 아래 노션을 통해 확인부탁드립니다
https://spiky-shoulder-7b9.notion.site/ToyProject-plogging-79a4abfa703344dd95726f215f279ec0?pvs=4