티스토리 뷰

SpringBoot와 Thymeleaf를 이용해서 간단하게 카카오톡 클론 코딩하는 방법에 대해 알아보겠습니다.

 

1. 개발환경

  • SpringBoot
    • 버전 : 3.1.5
    • JDK : 17
    • IDE : IntelliJ
  • MariaDB
    • 버전 : 11.1.2
  • Redis
    • 버전 : 3.0.504

 

2. DB 테이블 생성

CREATE TABLE `ROOM_INFO` (
  `ROOM_ID` varchar(100) NOT NULL COMMENT '방번호',
  `ROOM_NAME` varchar(100) NOT NULL COMMENT '방이름',
  PRIMARY KEY (`ROOM_ID`)
);

CREATE TABLE `ROOM_MEMBER` (
  `ROOM_ID` varchar(100) NOT NULL COMMENT '방번호',
  `MEMBER_ID` varchar(100) NOT NULL COMMENT '참가자',
  PRIMARY KEY (`ROOM_ID`,`MEMBER_ID`)
);

CREATE TABLE `USER_LOGIN_HISTORY` (
  `USER_ID` varchar(20) DEFAULT NULL COMMENT '사용자 아이디',
  `IP_ADDR` varchar(20) DEFAULT NULL COMMENT '접속IP',
  `REG_DT` datetime DEFAULT current_timestamp() COMMENT '등록일'
);

CREATE TABLE `USER_MASTER` (
  `USER_ID` varchar(20) NOT NULL COMMENT '사용자ID',
  `USER_PW` varchar(32) NOT NULL COMMENT '사용자 비밀번호',
  `USER_NAME` varchar(20) DEFAULT NULL COMMENT '사용자명',
  `PW_ERR_CNT` int(11) DEFAULT 0 COMMENT '비밀번호 오류 횟수',
  `REG_DT` datetime DEFAULT current_timestamp() COMMENT '등록시간',
  `MOD_DT` datetime DEFAULT current_timestamp() COMMENT '수정시간',
  `PROFILE_PATH` varchar(100) DEFAULT NULL COMMENT '회원프로필 사진 경로',
  `STAT_MSG` varchar(100) DEFAULT NULL COMMENT '상태메시지',
  PRIMARY KEY (`USER_ID`)
);

CREATE TABLE `USER_FRIEND` (
  `USER_ID` varchar(20) NOT NULL COMMENT '사용자ID',
  `FRIEND_ID` varchar(20) NOT NULL COMMENT '친구ID',
  `BOOKMARK_YN` varchar(1) NOT NULL DEFAULT 'N' COMMENT '즐겨찾기여부',
  `REG_DT` datetime NOT NULL DEFAULT current_timestamp() COMMENT '등록일',
  PRIMARY KEY (`USER_ID`,`FRIEND_ID`)
);

 

3. 프로젝트 생성

3.1. build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.5'
    id 'io.spring.dependency-management' version '1.1.3'
    id 'war'
}

apply plugin: 'war'
bootWar {
    archiveBaseName = '-'
    archiveFileName = 'ROOT.war'
    archiveVersion = "1.0.0"
}

group = 'com.myapi'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

repositories {
    mavenCentral()
}

dependencies {
    // basic
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-aop'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    providedCompile 'javax.servlet:javax.servlet-api:4.0.1'

    implementation 'jakarta.servlet:jakarta.servlet-api'
    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

    annotationProcessor 'org.projectlombok:lombok'
    compileOnly 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    // DB
    implementation 'org.springframework.boot:spring-boot-starter-data-redis:3.1.5'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0'
    implementation 'org.mariadb.jdbc:mariadb-java-client:3.0.4'

    // websocket
    implementation 'org.springframework.boot:spring-boot-starter-websocket'

    // util
    implementation 'com.google.code.gson:gson:2.9.0'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.7.1'
    implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
}



tasks.named('test') {
    useJUnitPlatform()
}

 

3.2. application.yml

spring:
  thymeleaf:
    enabled: true
    cache: true
    prefix: classpath:templates/
    suffix: .html
    check-template-location: true

server:
  port: 32000
  servlet:
    encoding:
      charset: UTF-8

mybatis:
  config-location: classpath:config/mybatis-config.xml
  mapper-locations: classpath:mapper/*.xml

---
spring:
  config:
    activate:
      on-profile: "local"

  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://127.0.0.1:3306/mymsg?useUnicode=true&characterEncoding=utf8
    username: admin
    password: admin

  log:
    file-path: D:\logs\mymsg\mymsg.log

  data:
    redis:
      port: 6379
      host: 127.0.0.1
      password: admin

  websocket:
    path: 127.0.0.1:38080

  file:
    profile-path: file:///D:/zeroBin/profile/
    profile-upload-path: D:/zeroBin/profile/

---
# cafe24 사용

spring:
  config:
    activate:
      on-profile: "prod"

  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: #운영URL#
    username: #운영ID#
    password: #운영PW#

  log:
    file-path: /dudqls3kr/logs/mymsg/mymsg.log 

  data:
    redis:
      port: 22529
      host: dudqls4kr.cafe24.com
      password:

  websocket:
    path: 210.114.6.196:32000

  file:
    profile-path: /dudqls3kr/image/profile/
    profile-upload-path: /dudqls3kr/image/profile/

 

4. 프로젝트 구조

mymsg-api
└─src
    ├─main
    │  ├─generated
    │  ├─java
    │  │  └─com
    │  │      └─myapi
    │  │          └─mymsgapi
    │  │              │  MymsgApiApplication.java
    │  │              │
    │  │              ├─comm
    │  │              │  ├─annotation
    │  │              │  │      LoginCheck.java
    │  │              │  │
    │  │              │  ├─aop
    │  │              │  │      LogAop.java
    │  │              │  │
    │  │              │  ├─config
    │  │              │  │      CacheConfig.java
    │  │              │  │      RedisConfig.java
    │  │              │  │      WebConfig.java
    │  │              │  │      WebSockConfig.java
    │  │              │  │
    │  │              │  ├─constants
    │  │              │  │      Constants.java
    │  │              │  │
    │  │              │  ├─exception
    │  │              │  │      ApiExceptionAdvice.java
    │  │              │  │      ApiExceptionEntity.java
    │  │              │  │      ApiResult.java
    │  │              │  │      YbBizException.java
    │  │              │  │
    │  │              │  ├─filter
    │  │              │  │      MessageFilter.java
    │  │              │  │
    │  │              │  ├─fundamental
    │  │              │  │      YBMap.java
    │  │              │  │
    │  │              │  ├─handler
    │  │              │  │      ChatHandler.java
    │  │              │  │
    │  │              │  ├─interceptor
    │  │              │  │      HttpSessionInterceptor.java
    │  │              │  │      LoginCheckInterceptor.java
    │  │              │  │
    │  │              │  ├─session
    │  │              │  │      SessionAdvice.java
    │  │              │  │      SessionKeys.java
    │  │              │  │      SessionStore.java
    │  │              │  │
    │  │              │  ├─types
    │  │              │  │      CertType.java
    │  │              │  │      ExceptType.java
    │  │              │  │
    │  │              │  └─utils
    │  │              │          CryptoUtil.java
    │  │              │          DateUtil.java
    │  │              │          HttpRequestUtil.java
    │  │              │          ListUtil.java
    │  │              │          MapUtil.java
    │  │              │          ObjectUtil.java
    │  │              │          SessionUtil.java
    │  │              │          StringUtil.java
    │  │              │          SystemUtil.java
    │  │              │
    │  │              ├─contoller
    │  │              │  ├─chat
    │  │              │  │  │  ChatApiController.java
    │  │              │  │  │  ChatViewController.java
    │  │              │  │  │
    │  │              │  │  └─dto
    │  │              │  │          ChatUserInfoReq.java
    │  │              │  │          ChatUserJoinReq.java
    │  │              │  │          ChatUserJoinRes.java
    │  │              │  │          RoomNameChangeReq.java
    │  │              │  │
    │  │              │  ├─comm
    │  │              │  │  │  CnstController.java
    │  │              │  │  │  ErrorCommController.java
    │  │              │  │  │  MainController.java
    │  │              │  │  │
    │  │              │  │  └─dto
    │  │              │  │          BaseRequest.java
    │  │              │  │          BaseResponse.java
    │  │              │  │          BaseUpdateResponse.java
    │  │              │  │          CnstRequest.java
    │  │              │  │          CnstResponse.java
    │  │              │  │
    │  │              │  └─user
    │  │              │      │  UserApiController.java
    │  │              │      │  UserViewController.java
    │  │              │      │
    │  │              │      └─dto
    │  │              │              AddFriendReq.java
    │  │              │              FindFriendReq.java
    │  │              │              FindFriendRes.java
    │  │              │              UpdateBookmarkReq.java
    │  │              │              UpdateStatMsgReq.java
    │  │              │              UserLginHistReq.java
    │  │              │              UserLginReq.java
    │  │              │              UserRegsReq.java
    │  │              │
    │  │              ├─dao
    │  │              │  ├─comm
    │  │              │  │      CommDAO.java
    │  │              │  │
    │  │              │  ├─room
    │  │              │  │      RoomDAO.java
    │  │              │  │
    │  │              │  └─user
    │  │              │          UserDAO.java
    │  │              │
    │  │              ├─model
    │  │              │  │  ChatMessage.java
    │  │              │  │  MemberInfo.java
    │  │              │  │  RoomInfo.java
    │  │              │  │  RoomMember.java
    │  │              │  │  UserFriendInfo.java
    │  │              │  │  UserLginInfo.java
    │  │              │  │  UserProfileInfo.java
    │  │              │  │  UserRoomInfo.java
    │  │              │  │
    │  │              │  └─vo
    │  │              │          RoomVO.java
    │  │              │          UserLginHistVO.java
    │  │              │          UserVO.java
    │  │              │
    │  │              └─service
    │  │                  ├─chat
    │  │                  │      ChatService.java
    │  │                  │
    │  │                  ├─comm
    │  │                  │      CnstService.java
    │  │                  │
    │  │                  ├─redis
    │  │                  │      RedisService.java
    │  │                  │
    │  │                  └─user
    │  │                          UserService.java
    │  │
    │  └─resources
    │      │  application.yml
    │      │  logback-spring.xml
    │      │
    │      ├─config
    │      │      mybatis-config.xml
    │      │
    │      ├─mapper
    │      │      CommMapper.xml
    │      │      RoomMapper.xml
    │      │      UserMapper.xml
    │      │
    │      ├─message
    │      │      errorMsg.properties
    │      │
    │      ├─properties
    │      │      constants.properties
    │      │
    │      ├─static
    │      │  │  favicon.ico
    │      │  │
    │      │  ├─css
    │      │  │      bigScreen.css
    │      │  │      chat.css
    │      │  │      chats.css
    │      │  │      find.css
    │      │  │      friends.css
    │      │  │      globals.css
    │      │  │      header.css
    │      │  │      login.css
    │      │  │      mobile.css
    │      │  │      modal.css
    │      │  │      more.css
    │      │  │      navigation.css
    │      │  │      profile.css
    │      │  │      reset.css
    │      │  │      search-bar.css
    │      │  │      styles.css
    │      │  │
    │      │  ├─images
    │      │  │      avatar.png
    │      │  │      chatting_room.png
    │      │  │      chat_room.png
    │      │  │      group.png
    │      │  │      kakaoFriends.png
    │      │  │      kakaoStory.png
    │      │  │      path.png
    │      │  │      profile_bg.png
    │      │  │
    │      │  ├─js
    │      │  │      common.js
    │      │  │      jquery-3.7.1.min.js
    │      │  │
    │      │  └─profile
    │      └─templates
    │          │  index.html
    │          │
    │          ├─common
    │          ├─error
    │          │      error.html
    │          │
    │          ├─layout
    │          │  └─fragments
    │          │          footer.html
    │          │          head.html
    │          │          header_top.html
    │          │
    │          └─views
    │              ├─chat
    │              │      chat.html
    │              │      chats.html
    │              │      find.html
    │              │      more.html
    │              │      roomInfo.html
    │              │      userProfile.html
    │              │
    │              └─user
    │                      chngPw.html
    │                      login.html
  • 참고로 프로젝트 구조는 cmd 창을 열고 tree /f 명령어를 입력하여 추출할 수 있습니다.



주요 코드는 다음 포스팅으로 이어집니다.

감사합니다.

최근에 올라온 글
Total
Today
Yesterday