[toyproject] 웹 애플리케이션 만들기1 - 프로젝트 생성과 DB 설계

한지연·2023년 6월 27일
0

프로젝트 설정

  • build.gradle
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)
}
  • yml 파일
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클라우드 사용해서 외래키들 설정같은 거 생각해보니 금방 정리 됐다.

프로젝트 구조

객체들 간의 관계 설정

  • User
@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<>();
  • PhotoList
@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 어노테이션을 사용해 매핑했다.

Security 설정 - 하는 중

@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

profile
배우고 활용하는 것을 즐기는 개발자, 한지연입니다!

0개의 댓글