diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml
new file mode 100644
index 0000000..c3aa6bd
--- /dev/null
+++ b/.github/workflows/CICD.yml
@@ -0,0 +1,140 @@
+name: CICD
+
+on:
+  push:
+    branches: [ "main" ]
+  pull_request:
+    branches: [ "main" ]
+
+permissions:
+  contents: read
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - name: Install JDK 17
+        uses: actions/setup-java@v3
+        with:
+          java-version: '17'
+          distribution: 'temurin'
+
+      - name: Create application-secret-deploy.yml
+        run: |
+          echo "Decoding SECRET_FILE secret and create application-secret-deploy.yml"
+          echo "${{ secrets.SECRET_FILE }}" | base64 -d > ./src/main/resources/application-secret-deploy.yml
+
+
+      - name: Build with Gradle
+        run: |
+          chmod 777 ./gradlew
+          ./gradlew clean assemble -x test
+
+      - name: Login to DockerHub
+        if: github.event_name == 'push'
+        uses: docker/login-action@v1
+        with:
+          username: ${{ secrets.DOCKERHUB_USERNAME }}
+          password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+      - name: Build Docker
+        if: github.event_name == 'push'
+        run: docker build --platform linux/amd64 -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO_NAME }} .
+
+      - name: Push Docker
+        if: github.event_name == 'push'
+        run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO_NAME }}:latest
+
+  deploy:
+    needs: build
+    if: github.event_name == 'push'
+    runs-on: ubuntu-latest
+    steps:
+      - name: Set target IP
+        run: |
+          STATUS=$(curl -o /dev/null -w "%{http_code}" "http://${{ secrets.LIVE_SERVER_IP }}/env")
+          echo $STATUS
+          if [ $STATUS = 200 ]; then
+            CURRENT_UPSTREAM=$(curl -s "http://${{ secrets.LIVE_SERVER_IP }}/env")
+          else
+            CURRENT_UPSTREAM=green
+          fi
+          echo CURRENT_UPSTREAM=$CURRENT_UPSTREAM >> $GITHUB_ENV
+          if [ $CURRENT_UPSTREAM = blue ]; then
+            echo "CURRENT_PORT=8080" >> $GITHUB_ENV
+            echo "STOPPED_PORT=8081" >> $GITHUB_ENV
+            echo "TARGET_UPSTREAM=green" >> $GITHUB_ENV
+          elif [ $CURRENT_UPSTREAM = green ]; then
+            echo "CURRENT_PORT=8081" >> $GITHUB_ENV
+            echo "STOPPED_PORT=8080" >> $GITHUB_ENV
+            echo "TARGET_UPSTREAM=blue" >> $GITHUB_ENV
+          else
+            echo "error"
+            exit 1
+          fi
+
+      - name: Login Server
+        uses: appleboy/ssh-action@master
+        with:
+          username: ${{ secrets.SERVER_USER_NAME }}
+          host: ${{ secrets.LIVE_SERVER_IP }}
+          key: ${{ secrets.SSH_KEY }}
+          script_stop: true
+
+      - name: Docker compose
+        uses: appleboy/ssh-action@master
+        with:
+          username: ${{ secrets.SERVER_USER_NAME }}
+          host: ${{ secrets.LIVE_SERVER_IP }}
+          key: ${{ secrets.SSH_KEY }}
+          script_stop: true
+          script: |
+            sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO_NAME }}:latest
+            sudo docker-compose -f docker-compose-${{env.TARGET_UPSTREAM}}.yml up -d
+
+      - name: Check deploy server URL
+        uses: jtalk/url-health-check-action@v3
+        with:
+          url: http://${{ secrets.LIVE_SERVER_IP }}:${{env.STOPPED_PORT}}/env
+          max-attempts: 5
+          retry-delay: 10s
+
+      - name: Change nginx upstream
+        uses: appleboy/ssh-action@master
+        with:
+          username: ${{ secrets.SERVER_USER_NAME }}
+          host: ${{ secrets.LIVE_SERVER_IP }}
+          key: ${{ secrets.SSH_KEY }}
+          script_stop: true
+          script: |
+            sudo docker exec -i nginxserver bash -c 'echo "set \$service_url ${{ env.TARGET_UPSTREAM }};" > /etc/nginx/conf.d/service-env.inc && nginx -s reload' 
+
+      - name: Stop current server
+        uses: appleboy/ssh-action@master
+        with:
+          username: ${{ secrets.SERVER_USER_NAME }}
+          host: ${{ secrets.LIVE_SERVER_IP }}
+          key: ${{ secrets.SSH_KEY }}
+          script_stop: true
+          script: |
+            if [ $(sudo docker ps -a -q -f name=${{env.CURRENT_UPSTREAM}}) ]; then
+              sudo docker stop ${{env.CURRENT_UPSTREAM}}
+              sudo docker rm ${{env.CURRENT_UPSTREAM}}
+            else
+              echo "Container ${{env.CURRENT_UPSTREAM}} does not exist, skipping stop and remove steps."
+            fi
+
+      - name: Delete old docker images
+        uses: appleboy/ssh-action@master
+        with:
+          username: ${{ secrets.SERVER_USER_NAME }}
+          host: ${{ secrets.LIVE_SERVER_IP }}
+          key: ${{ secrets.SSH_KEY }}
+          script: |
+            dangling_images=$(sudo docker images -f "dangling=true" -q)
+            if [ ! -z "$dangling_images" ]; then
+              sudo docker rmi $dangling_images
+            else
+              echo "No dangling images found"
+            fi
diff --git a/.gitignore b/.gitignore
index 0597b0e..4cc7f9f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,8 @@ build/
 !gradle/wrapper/gradle-wrapper.jar
 !**/src/main/**/build/
 !**/src/test/**/build/
+!**/src/main/resoureces/application.yml
+application-*.yml
 
 ### STS ###
 .apt_generated
@@ -38,4 +40,5 @@ out/
 
 
 ### SET ###
-!**/src/main/resources/application.properties
\ No newline at end of file
+application.properties
+application.yml
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..6b5ef88
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,6 @@
+FROM amazoncorretto:17-alpine-jdk
+ARG JAR_FILE=build/libs/*.jar
+ARG PROFILES
+ARG ENV
+COPY ${JAR_FILE} app.jar
+ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILES}", "-Dserver.env=${ENV}", "-jar", "app.jar"]
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 07e03f8..e76c10b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -25,8 +25,8 @@ repositories {
 
 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-oauth2-client'
+//	implementation 'org.springframework.boot:spring-boot-starter-security'
 	implementation 'org.springframework.boot:spring-boot-starter-web'
 	compileOnly 'org.projectlombok:lombok'
 	runtimeOnly 'com.mysql:mysql-connector-j'
diff --git a/settings.gradle b/settings.gradle
index 7bef29d..85b26a6 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-rootProject.name = 'main'
+rootProject.name = 'code-view'
diff --git a/src/main/java/codeview/main/controller/BoardController.java b/src/main/java/codeview/main/controller/BoardController.java
new file mode 100644
index 0000000..a08fdbc
--- /dev/null
+++ b/src/main/java/codeview/main/controller/BoardController.java
@@ -0,0 +1,65 @@
+package codeview.main.controller;
+
+import codeview.main.dto.ApiResponse;
+import codeview.main.dto.BoardRequest;
+import codeview.main.dto.BoardResponse;
+import codeview.main.entity.Board;
+import codeview.main.service.BoardService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Optional;
+
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/board")
+public class BoardController {
+    private final BoardService boardService;
+    @GetMapping("/{id}")
+    public ResponseEntity<BoardResponse> getBoardById(@PathVariable Long id) {
+        Optional<Board> findBoardObj = boardService.findBoardById(id);
+        if (findBoardObj.isPresent()) {
+            BoardResponse response = new BoardResponse(findBoardObj.get());
+            return ResponseEntity.ok(response);
+        } else {
+            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
+        }
+    }
+
+    @PostMapping("/write")
+    public ResponseEntity<ApiResponse<BoardResponse>> boardSave(@RequestBody Board board) {
+        Board saveBoard = boardService.save(board);
+        BoardResponse boardResponse = new BoardResponse(saveBoard);
+        ApiResponse<BoardResponse> response = new ApiResponse<>(HttpStatus.CREATED, "Board Write Success", boardResponse);
+        return ResponseEntity.status(HttpStatus.CREATED)
+                .body(response);
+    }
+    @PutMapping("/{id}")
+    public ResponseEntity<BoardResponse> updateBoard(
+            @PathVariable Long id,
+            @RequestBody BoardRequest boardRequest) {
+        Board updatedBoard = new Board();
+        updatedBoard.setTitle(boardRequest.getTitle());
+
+        try {
+            Board savedBoard = boardService.updateBoard(id, updatedBoard);
+            BoardResponse responseDto = new BoardResponse(savedBoard);
+            return ResponseEntity.ok(responseDto);
+        } catch (RuntimeException e) {
+            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
+        }
+    }
+
+    @DeleteMapping("/{id}")
+    public ResponseEntity<BoardResponse> deleteBoard(@PathVariable Long id) {
+        try {
+            boardService.deleteBoard(id);
+            return ResponseEntity.noContent().build();
+        }catch (RuntimeException e){
+            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
+        }
+    }
+}
diff --git a/src/main/java/codeview/main/controller/ServerHealthCheckController.java b/src/main/java/codeview/main/controller/ServerHealthCheckController.java
new file mode 100644
index 0000000..e85962b
--- /dev/null
+++ b/src/main/java/codeview/main/controller/ServerHealthCheckController.java
@@ -0,0 +1,38 @@
+package codeview.main.controller;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+@RestController
+public class ServerHealthCheckController {
+    @Value("${server.env}")
+    private String env;
+    @Value("${server.port}")
+    private String serverPort;
+    @Value("${server.serverAddress}")
+    private String serverAddress;
+    @Value("${serverName}")
+    private String serverName;
+
+    @GetMapping("/hc")
+    public ResponseEntity<?> healthCheck() {
+        Map<String, String> responseData = new TreeMap<>();
+        responseData.put("serverName", serverName);
+        responseData.put("serverAddress", serverAddress);
+        responseData.put("serverPort", serverPort);
+        responseData.put("env", env);
+        return ResponseEntity.ok(responseData);
+    }
+
+    @GetMapping("/env")
+    @ResponseBody
+    public ResponseEntity<?> getEnv() {
+        return ResponseEntity.ok().body(env);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/codeview/main/dto/ApiResponse.java b/src/main/java/codeview/main/dto/ApiResponse.java
new file mode 100644
index 0000000..89677fa
--- /dev/null
+++ b/src/main/java/codeview/main/dto/ApiResponse.java
@@ -0,0 +1,20 @@
+package codeview.main.dto;
+
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.http.HttpStatus;
+
+@Getter
+@Setter
+public class ApiResponse<T> {
+    private HttpStatus httpStatus;
+    private String message;
+    private T data;
+
+    public ApiResponse(HttpStatus httpStatus, String message, T data) {
+        this.httpStatus = httpStatus;
+        this.message = message;
+        this.data = data;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/codeview/main/dto/BoardRequest.java b/src/main/java/codeview/main/dto/BoardRequest.java
new file mode 100644
index 0000000..1e5d805
--- /dev/null
+++ b/src/main/java/codeview/main/dto/BoardRequest.java
@@ -0,0 +1,9 @@
+package codeview.main.dto;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class BoardRequest {
+    private String title;
+}
\ No newline at end of file
diff --git a/src/main/java/codeview/main/dto/BoardResponse.java b/src/main/java/codeview/main/dto/BoardResponse.java
new file mode 100644
index 0000000..d539ce9
--- /dev/null
+++ b/src/main/java/codeview/main/dto/BoardResponse.java
@@ -0,0 +1,17 @@
+package codeview.main.dto;
+
+import codeview.main.entity.Board;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class BoardResponse {
+    private Long id;
+    private String title;
+
+    public BoardResponse(Board board) {
+        this.id = board.getId();
+        this.title = board.getTitle();
+    }
+}
diff --git a/src/main/java/codeview/main/entity/Board.java b/src/main/java/codeview/main/entity/Board.java
new file mode 100644
index 0000000..34c43cb
--- /dev/null
+++ b/src/main/java/codeview/main/entity/Board.java
@@ -0,0 +1,25 @@
+package codeview.main.entity;
+
+import jakarta.persistence.*;
+import lombok.*;
+
+import java.util.List;
+
+@Entity
+@Getter @Setter
+@NoArgsConstructor
+public class Board {
+    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
+    @Column
+    private String title;
+//
+//    @Column @OneToOne
+//    private Content content;
+//
+//    @Column @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
+//    private List<Comment> commentList;
+
+    public Board(String title) {
+        this.title = title;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/codeview/main/entity/Comment.java b/src/main/java/codeview/main/entity/Comment.java
new file mode 100644
index 0000000..f572b03
--- /dev/null
+++ b/src/main/java/codeview/main/entity/Comment.java
@@ -0,0 +1,10 @@
+package codeview.main.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+
+@Entity
+public class Comment {
+    @Id
+    private Long id;
+}
diff --git a/src/main/java/codeview/main/entity/Content.java b/src/main/java/codeview/main/entity/Content.java
new file mode 100644
index 0000000..c07afcb
--- /dev/null
+++ b/src/main/java/codeview/main/entity/Content.java
@@ -0,0 +1,12 @@
+package codeview.main.entity;
+
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+
+@Entity
+public class Content {
+    @Id
+    private Long id;
+
+}
diff --git a/src/main/java/codeview/main/repository/BoardRepository.java b/src/main/java/codeview/main/repository/BoardRepository.java
new file mode 100644
index 0000000..262b5b4
--- /dev/null
+++ b/src/main/java/codeview/main/repository/BoardRepository.java
@@ -0,0 +1,9 @@
+package codeview.main.repository;
+
+import codeview.main.entity.Board;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface BoardRepository extends JpaRepository<Board, Long> {
+}
diff --git a/src/main/java/codeview/main/service/BoardService.java b/src/main/java/codeview/main/service/BoardService.java
new file mode 100644
index 0000000..cf0246e
--- /dev/null
+++ b/src/main/java/codeview/main/service/BoardService.java
@@ -0,0 +1,35 @@
+package codeview.main.service;
+
+import codeview.main.entity.Board;
+import codeview.main.repository.BoardRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+
+@Service
+@RequiredArgsConstructor
+public class BoardService {
+    private final BoardRepository boardRepository;
+    public Board save(Board board) {
+        return boardRepository.save(board);
+    }
+    public Optional<Board> findBoardById(Long id) {
+        return boardRepository.findById(id);
+    }
+    public Board updateBoard(Long id, Board updateBoard) {
+        return boardRepository.findById(id)
+                .map(board -> {
+                    board.setTitle(updateBoard.getTitle());
+                    return board;
+                })
+                .orElseThrow(() -> new RuntimeException("Board not found"));
+    }
+    public void deleteBoard(Long id) {
+        if (boardRepository.existsById(id)) {
+            boardRepository.deleteById(id);
+        } else {
+            throw new RuntimeException("Board not found");
+        }
+    }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..4bf15cc
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,71 @@
+spring:
+  profiles:
+    active: local
+    group:
+      local: local, common, secret-dev
+      blue: blue, common, secret-deploy
+      green: green, common, secret-deploy
+
+server:
+  env: blue
+
+---
+
+spring:
+  config:
+    activate:
+      on-profile: local
+
+server:
+  port: 8080
+  serverAddress: localhost
+
+serverName: local_server
+
+---
+
+spring:
+  config:
+    activate:
+      on-profile: blue
+
+server:
+  port: 8080
+  serverAddress: 34.64.190.54
+
+serverName: blue_server
+
+---
+
+spring:
+  config:
+    activate:
+      on-profile: green
+
+server:
+  port: 8081
+  serverAddress: 34.64.190.54
+
+serverName: green_server
+
+---
+
+spring:
+  config:
+    activate:
+      on-profile: common
+
+  application:
+    name: codeview
+  jpa:
+    hibernate:
+      ddl-auto: create
+    show_sql: true
+    properties:
+      hibernate:
+        format_sql: true
+        dialect: org.hibernate.dialect.MySQLDialect
+
+logging:
+  level:
+    org.springframework.security: DEBUG
\ No newline at end of file
diff --git a/src/test/java/codeview/main/MainApplicationTests.java b/src/test/java/codeview/main/MainApplicationTests.java
deleted file mode 100644
index 797cc27..0000000
--- a/src/test/java/codeview/main/MainApplicationTests.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package codeview.main;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class MainApplicationTests {
-
-	@Test
-	void contextLoads() {
-	}
-
-}