Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/#42 backend swagger #43

Merged
merged 26 commits into from
Mar 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
5ad3fcb
Refactor : ๋‰ด์Šค, ๋ถ๋งˆํฌ ๋”๋ฏธ ๋ฐ์ดํ„ฐ ์ˆ˜์ • ๋ฐ ์ด๋ฏธ์ง€ ํ˜•์‹ ๋ณ€๊ฒฝ
realhsb Mar 5, 2024
5731da7
Merge pull request #18 from tukcomCD2024/feat/#17_ios_data
realhsb Mar 5, 2024
449b394
feat: NavigationStack์„ ์œ„ํ•œ Path ์„ค์ •
realhsb Mar 10, 2024
529fad8
fix: ์˜คํƒ€ ์ˆ˜์ •
realhsb Mar 10, 2024
1895f96
feat: CustomNavigationBar ์ƒ์„ฑ
realhsb Mar 10, 2024
797085a
fix: NavigationStack ์—ฐ๊ฒฐ
realhsb Mar 14, 2024
9e93056
feat: ๋กœ๊ทธ์ธ ํ™”๋ฉด ๋ฐ ์งˆ๋ฌธ ํ™”๋ฉด ์ถ”๊ฐ€
realhsb Mar 14, 2024
642e980
design: ๋กœ๊ทธ์ธ Image Assets ์ถ”๊ฐ€
realhsb Mar 14, 2024
7519277
fix: ์ฝ”๋“œ ์ˆ˜์ •
realhsb Mar 14, 2024
8696eb2
Merge pull request #23 from tukcomCD2024/feat/#19_ios_signupview
realhsb Mar 14, 2024
6b92658
design: Pretendard ํฐํŠธ ํŒŒ์ผ ์ถ”๊ฐ€ ๋ฐ info ์„ค์ •
realhsb Mar 19, 2024
0ee3e53
fix: ํฐํŠธ ํŒŒ์ผ ์ˆ˜์ •
realhsb Mar 19, 2024
6ea4a7b
feat: Font extenstion ์ถ”๊ฐ€
realhsb Mar 19, 2024
d10bc41
Merge pull request #33 from tukcomCD2024/feat/#24_ios_fontSetting
realhsb Mar 19, 2024
57ffedb
fix: ๋ถˆํ•„์š”ํ•œ Chat View ๋ฐ Model ์‚ญ์ œ
realhsb Mar 19, 2024
5f3e2f2
fix: pathtype์—์„œ chat view ์ด๋ฆ„ ์ˆ˜์ •
realhsb Mar 19, 2024
4f26240
feat: OpenAI ํ”„๋ ˆ์ž„์›Œํฌ ์ถ”๊ฐ€
realhsb Mar 19, 2024
873a392
Merge pull request #38 from tukcomCD2024/DeviOS
realhsb Mar 19, 2024
4a5b7c8
feat: ChatGPT์™€์˜ ์ฑ„ํŒ… ๊ธฐ๋Šฅ
realhsb Mar 19, 2024
5e3a298
fix: Custom NavigationBar ์ˆ˜์ •
realhsb Mar 19, 2024
a997181
Merge pull request #39 from tukcomCD2024/Feat/#37-ios-gpt-chatting2
realhsb Mar 19, 2024
9453217
Merge pull request #40 from tukcomCD2024/DeviOS
realhsb Mar 19, 2024
de85c55
Merge branch 'Dev-backend' into Dev
yeonjy Mar 20, 2024
75c74cd
feat: swagger๋ฅผ ์œ„ํ•œ ์˜์กด์„ฑ ์ถ”๊ฐ€
yeonjy Mar 20, 2024
bbe23f2
feat: Swagger ์„ค์ • ๊ตฌํ˜„
yeonjy Mar 20, 2024
853bc0d
refactor: ํ•˜๋“œ์ฝ”๋”ฉ ์ œ๊ฑฐ & ์—ญํ•  ๋ณ„ ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ
yeonjy Mar 20, 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
5 changes: 3 additions & 2 deletions backend/core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,20 @@ repositories {
}

dependencies {
//jwt
implementation 'com.auth0:java-jwt:4.2.1'

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-web'

compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
runtimeOnly 'com.mysql:mysql-connector-j'

implementation 'org.springframework.boot:spring-boot-starter-amqp'
implementation 'org.mapstruct:mapstruct:1.5.5.Final'
implementation 'org.jsoup:jsoup:1.15.3'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'

annotationProcessor 'org.projectlombok:lombok'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.rollthedice.backend.global.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.servers.Server;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Configuration
public class SwaggerConfig {
private final String JWT = "JWT";
private final String BEARER = "Bearer";

@Bean
public OpenAPI openAPI() {
SecurityRequirement securityRequirement = new SecurityRequirement().addList(JWT);
return new OpenAPI()
.servers(getServers())
.info(getInfo())
.addSecurityItem(securityRequirement)
.components(getComponents());
}

private List<Server> getServers() {
return List.of(new Server()
.url("/api")
.description("๋ฐฑ์—”๋“œ api ์„œ๋ฒ„")
);
}

private Info getInfo() {
return new Info()
.title("Roll The Dice API")
.description("์š”์•ฝ๋œ ๋‰ด์Šค๋ฅผ AR๋กœ ์žฌ๋ฏธ์žˆ๊ฒŒ ์ฆ๊ธฐ๋Š” ์„œ๋น„์Šค")
.version("demo");
}

private Components getComponents() {
return new Components().addSecuritySchemes(JWT, new SecurityScheme()
.name(JWT)
.type(SecurityScheme.Type.HTTP)
.scheme(BEARER)
.bearerFormat(JWT)
);
}
}
301 changes: 159 additions & 142 deletions iOS/RollTheDice/RollTheDice.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

18 changes: 18 additions & 0 deletions iOS/RollTheDice/RollTheDice/Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIAppFonts</key>
<array>
<string>Pretendard-Black.otf</string>
<string>Pretendard-Bold.otf</string>
<string>Pretendard-ExtraBold.otf</string>
<string>Pretendard-ExtraLight.otf</string>
<string>Pretendard-Light.otf</string>
<string>Pretendard-Medium.otf</string>
<string>Pretendard-Regular.otf</string>
<string>Pretendard-SemiBold.otf</string>
<string>Pretendard-Thin.otf</string>
</array>
</dict>
</plist>
34 changes: 34 additions & 0 deletions iOS/RollTheDice/RollTheDice/Resources/Font/Font.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//
// Font.swift
// RollTheDice
//
// Created by Subeen on 3/14/24.
//

import SwiftUI

extension Font {

// Bold
static let pretendardBold40: Font = .custom("Pretendard-Bold", size: 40)
static let pretendardBold32: Font = .custom("Pretendard-Bold", size: 32)
static let pretendardBold24: Font = .custom("Pretendard-Bold", size: 24)
static let pretendardBold14: Font = .custom("Pretendard-Bold", size: 14)
static let pretendardBold12: Font = .custom("Pretendard-Bold", size: 12)

// Regular
static let pretendardRegular20: Font = .custom("Pretendard-Regular", size: 20)
static let pretendardRegular14: Font = .custom("Pretendard-Regular", size: 14)

}


/// ํฐํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
func checkFontFile() {
for fontFamily in UIFont.familyNames {
for fontName in UIFont.fontNames(forFamilyName: fontFamily) {
print(fontName)
}
}
}

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "appleLoginBtn.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "kakaoLoginBtn.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
37 changes: 36 additions & 1 deletion iOS/RollTheDice/RollTheDice/RollTheDiceApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,44 @@ import SwiftUI

@main
struct RollTheDiceApp: App {

@StateObject var appState = AppState()
@StateObject private var pathModel = PathModel()

@StateObject var newsListViewModel = NewsListViewModel()

var body: some Scene {
WindowGroup {
MainTabView()

if appState.hasLogin {
NavigationStack(path: $pathModel.paths) {
MainTabView()
.environmentObject(newsListViewModel)
.navigationDestination(for: PathType.self, destination: { pathType in

switch pathType {
case .chatView(isAiMode: true) :
GPTChatView()
.navigationBarBackButtonHidden()

case .chatView(isAiMode: false):
Text("user")
.navigationBarBackButtonHidden()
}
})
}
.environmentObject(pathModel)

} else {
SignUpView()
}
}

}
}

/// ๋กœ๊ทธ์ธ ์ƒํƒœ ๊ด€๋ฆฌ
class AppState: ObservableObject {

@AppStorage("hasLogin") var hasLogin = true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
//
// CustomNavigationBar.swift
// DittoCommunity
//
// Created by Subeen on 2023/11/25.
//

import SwiftUI

struct CustomNavigationBar: View {
let title: String

let isDisplayLeadingBtn: Bool
let isDisplayTrailingBtn: Bool

let leadingItems: [(Image, () -> Void)]
let trailingItems: [(Image, () -> Void)]

init(
title: String = "",
isDisplayLeadingBtn: Bool = true,
isDisplayTrailingBtn: Bool = true,
leadingItems: [(Image, () -> Void)] = [(Image("chevron.left"), {})],
trailingItems: [(Image, () -> Void)] = [(Image("chevron.left"), {})]
) {
self.title = title
self.isDisplayLeadingBtn = isDisplayLeadingBtn
self.isDisplayTrailingBtn = isDisplayTrailingBtn
self.leadingItems = leadingItems
self.trailingItems = trailingItems
}

var body: some View {
HStack(spacing: 0) {
if isDisplayLeadingBtn {
// ForEach(leadingItems, id:\.self) { item in
// Button(
// action: {
// item.1()
// },
// label: {
// leadingItems[index].0
// .foregroundStyle(.basicWhite)
// }
// )
// }
}

Spacer()

Text(title)
.foregroundStyle(.basicWhite)

Spacer()

if isDisplayTrailingBtn {
ForEach(trailingItems.indices) { index in
Button(
action: {
trailingItems[index].1()
},
label: {
trailingItems[index].0
.foregroundStyle(.basicWhite)
}
)
}
}
}
.padding(.horizontal, 20)
.frame(height: 44)
}
}

struct IdentifiableImage: Identifiable {
let id = UUID()
let image: Image
}

struct CustomNavigationBar_Previews: PreviewProvider {
static var previews: some View {
CustomNavigationBar()
.previewLayout(.sizeThatFits)
}
}
16 changes: 16 additions & 0 deletions iOS/RollTheDice/RollTheDice/Source/Model/Path/Path.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// Path.swift
// RollTheDice
//
// Created by Subeen on 3/10/24.
//

import Foundation

class PathModel: ObservableObject {
@Published var paths: [PathType]

init(paths: [PathType] = []) { // ๋นˆ ๋ฐฐ์—ด๋กœ ์ดˆ๊ธฐํ™”. ์•ฑ ์‹คํ–‰์‹œ ํŠน์ • ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ํ•ด๋‹น ๋ทฐ๋กœ ์ดˆ๊ธฐํ™”ํ•  ๊ฒƒ.
self.paths = paths
}
}
12 changes: 12 additions & 0 deletions iOS/RollTheDice/RollTheDice/Source/Model/Path/PathType.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//
// PathType.swift
// RollTheDice
//
// Created by Subeen on 3/10/24.
//

import Foundation

enum PathType: Hashable {
case chatView(isAiMode: Bool)
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,16 @@ public class BookmarkListViewModel: ObservableObject {
init(
bookmarkList: [Bookmark] = [
.init(title: "2024๋…„ โ€˜์†Œ์…œ ๋ฏธ๋””์–ด ๋‹ค์ด์–ดํŠธโ€™๋ฅผ ์œ„ํ•ด ๋ฐ”๊ฟ”๋ณผ ๊ฒƒ", date: "2023๋…„12์›”3์ผ", image: "exampleNews", content: "2024๋…„์œผ๋กœ ์ ‘์–ด๋“ ์ง€ ํ•œ ๋‹ฌ์ด ๋„˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜ฌ ํ•ด๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜๋Ÿฌ๊ฐˆ์ง€ ์˜ˆ์ธกํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค. ํ•œ ๊ฐ€์ง€ ํ™•์‹คํ•œ ๊ฒƒ์€ ์ •์น˜์ ์œผ๋กœ ๋งค์šฐ ์ค‘์š”ํ•œ ํ•ด๋ผ๋Š” ์ ์ด๋‹ค. ๋ฏธ๊ตญ๊ณผ ๋Ÿฌ์‹œ์•„, ์šฐํฌ๋ผ์ด๋‚˜, ๋ฐฉ๊ธ€๋ผ๋ฐ์‹œ, ์ธ๋„, ๋Œ€๋งŒ, ํ•œ๊ตญ, ๋‚จ์•„ํ”„๋ฆฌ์นด๊ณตํ™”๊ตญ, ์œ ๋Ÿฝ์˜ํšŒ, ์˜๊ตญ์—์„œ ์„ ๊ฑฐ๊ฐ€ ์น˜๋Ÿฌ์งˆ ์˜ˆ์ •์ด๋‹ค.", isBookmarked: false),
.init(title: "ํ•ด์™ธ์›์ • ๊ฐ€๋˜ ์ค„๊ธฐ์„ธํฌ์น˜๋ฃŒ ์ด์   ๊ตญ๋‚ด์„œ๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค", date: "2023๋…„2์›”13์ผ", image: "exampleNews", content: "์ฒจ์ƒ๋ฒ• ๊ฐœ์ •์•ˆ์ด ์ด๋‹ฌ 1์ผ ๊ตญํšŒ๋ฅผ ํ†ต๊ณผํ•ด ๋‚ด๋…„๋ถ€ํ„ฐ ์‹œํ–‰๋œ๋‹ค. ์ด์— ๋”ฐ๋ผ ์‹์•ฝ์ฒ˜ ํ—ˆ๊ฐ€ ์—†์ด๋„ ์•ˆ์ „์„ฑยท์œ ํšจ์„ฑ์ด ํ™•์ธ๋˜๋ฉด ๊ตญ๋‚ด์—์„œ๋„ ์ฒจ๋‹จ์žฌ์ƒ์˜๋ฃŒ ์น˜๋ฃŒ๊ฐ€ ํ—ˆ์šฉ๋˜๊ณ  ๋ชจ๋“  ์งˆํ™˜์— ๋Œ€ํ•œ ์ž„์ƒ์—ฐ๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค. ", isBookmarked: false),
.init(title: "ํ™€๋กœ ์„  ์ž๋ฆฝ์ค€๋น„์ฒญ๋…„, ๋ฐฐ๊ณฏ์ง€ ์•Š๊ฒŒโ€ฆ์šฐ์ฒด๊ตญ, ๋งค์ผ ์‹๋น„ ์ง€์›", date: "2023๋…„2์›”13์ผ", content: "๊ณผํ•™๊ธฐ์ˆ ์ •๋ณดํ†ต์‹ ๋ถ€ ์šฐ์ •์‚ฌ์—…๋ณธ๋ถ€๋Š” ์‚ฌํšŒ์— ์ฒซ๋ฐœ์„ ๋‚ด๋”›๋Š” ์ž๋ฆฝ์ค€๋น„์ฒญ๋…„์ด ๊ฑด๊ฐ•ํ•œ ์‚ฌํšŒ๊ตฌ์„ฑ์›์œผ๋กœ ์„ฑ์žฅํ•˜๋„๋ก ์‹๋น„๋ฅผ ์ง€์›ํ•˜๋Š” '์šฐ์ฒด๊ตญ ์ฒญ๋…„๋ฐฅ์‹ฌ ์Šคํƒ€ํŠธ ์˜จ(ๆบซ)' ์‚ฌ์—…์„ ํ™•๋Œ€ ์ถ”์ง„ํ•œ๋‹ค๊ณ  14์ผ ๋ฐํ˜”๋‹ค.", isBookmarked: false),
.init(title: "NHN, ์ž‘๋…„ ์˜์—…์ต 555์–ต์›...์ „๋…„๋น„ 42% โ†‘", date: "2023๋…„2์›”13์ผ", image: "exampleNews", content: "2NHN์€ ์—ฐ๊ฒฐ๊ธฐ์ค€ ์ง€๋‚œํ•ด ์˜์—…์ด์ต์ด 555์–ต์›์œผ๋กœ ์ „๋…„ ๋Œ€๋น„ 42.2% ์ฆ๊ฐ€ํ–ˆ๋‹ค๊ณ  14์ผ ๋ฐํ˜”๋‹ค.๊ฐ™์€ ๊ธฐ๊ฐ„ ๋งค์ถœ์€ 7.3% ์ฆ๊ฐ€ํ•œ 2์กฐ2696์–ต์›์œผ๋กœ ์—ฐ๊ฐ„ ์ตœ๋Œ€์น˜๋ฅผ ๊ธฐ๋กํ–ˆ๋‹ค. ์ž‘๋…„ 4๋ถ„๊ธฐ ๋งค์ถœ์€ 5983์–ต์›์œผ๋กœ ์ „๋…„ ๋™๊ธฐ ๋Œ€๋น„ 6.7% ์˜ฌ๋ž๋‹ค. ๋ฐ˜๋ฉด ์˜์—…์†์‹ค์€ 78์–ต์›์œผ๋กœ ์ ์ž์ „ํ™˜ํ–ˆ๋‹ค. ์ปค๋จธ์Šค ๋ถ€๋ฌธ์˜ ์žฅ๊ธฐ ๋ฏธํšŒ์ˆ˜์ฑ„๊ถŒ ๋Œ€์†์ƒ๊ฐ๋น„ ์ธ์‹๊ณผ ๊ธฐ์ˆ  ๋ถ€๋ฌธ์˜ ๊ธฐ ์ธ์‹ ๋งค์ถœ ์ฐจ๊ฐ ๋“ฑ ์ผํšŒ์„ฑ ์š”์ธ์ด ์˜ํ–ฅ์„ ๋ฏธ์ณค๋‹ค.", isBookmarked: false),
.init(title: "์•ค์Šค๋กœํ”ฝ ์ตœ์‹  AI ๋ชจ๋ธ 'ํด๋กœ๋“œ3' ์ถœ์‹œ", date: "2023๋…„3์›”13์ผ", image: "https://imgnews.pstatic.net/image/014/2024/03/05/0005151141_001_20240305101610000.jpg?type=w647", content: "์˜คํ”ˆAI์˜ ๋Œ€ํ•ญ๋งˆ ์•ค์Šค๋กœํ”ฝ์ด ์ƒ์„ฑํ˜• ์ธ๊ณต์ง€๋Šฅ(AI) ์ตœ์‹  ๋ชจ๋ธ 'ํด๋กœ๋“œ'(Claude)3๋ฅผ ์„ ๋ณด์ด๋ฉด์„œ ์ƒ์„ฑํ˜• AI ์ฃผ๋„๊ถŒ์„ ์žก๊ธฐ ์œ„ํ•œ ๊ฒฝ์Ÿ์ด ๋‹ค์‹œ ๋œจ๊ฑฐ์›Œ์ง€๊ณ  ์žˆ๋‹ค. ์•ค์Šค๋กœํ”ฝ์€ ์ง€๋‚œ ํ•œ ํ•ด ๋™์•ˆ ๊ตฌ๊ธ€๊ณผ ์„ธ์ผ์ฆˆํฌ์Šค, ์•„๋งˆ์กด ๋“ฑ์—์„œ ์ด 73์–ต ๋‹ฌ๋Ÿฌ(์•ฝ 9์กฐ7309์–ต ์›)๋ฅผ ํˆฌ์ž๋ฐ›๊ณ  'ํด๋กœ๋“œ3'๋ฅผ ๋‚ด๋†จ๋Š”๋ฐ ์˜คํ”ˆAI์˜ ์ฑ—GPT-4๋ฅผ ๋Šฅ๊ฐ€ํ•œ๋‹ค๊ณ  ๋„๋ฐœํ–ˆ๋‹ค.", isBookmarked: true),
.init(title: "SK C&C, ์™ธ๋ถ€ ์ „๋ฌธ๊ฐ€ ๋Œ€๊ฑฐ ์˜์ž…โ€ฆ โ€œ์‹ ์„ฑ์žฅ ๋™๋ ฅ ๊ฐ•ํ™”โ€", date: "2023๋…„2์›”13์ผ", image: "https://imgnews.pstatic.net/image/366/2024/03/05/0000975131_001_20240305093504301.jpg?type=w647", content: "SK C&C๋Š” ๊ตญ๋‚ด์™ธ ์‹ ์„ฑ์žฅ ๋™๋ ฅ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ์ธ๊ณต์ง€๋Šฅ(AI)ยทํด๋ผ์šฐ๋“œยท๋””์ง€ํ„ธ ํŒฉํ† ๋ฆฌยทESG(ํ™˜๊ฒฝยท์‚ฌํšŒยท์ง€๋ฐฐ๊ตฌ์กฐ) ๋“ฑ 4๋Œ€ ์„ฑ์žฅ ์‚ฌ์—…๊ณผ ๋””์ง€ํ„ธ ์ปจ์„คํŒ… ์ค‘์‹ฌ์œผ๋กœ ์™ธ๋ถ€ ์ „๋ฌธ๊ฐ€๋ฅผ ๋Œ€๊ฑฐ ์˜์ž…ํ•ด ์ „์ง„ ๋ฐฐ์น˜ํ–ˆ๋‹ค๊ณ  5์ผ ๋ฐํ˜”๋‹ค.", isBookmarked: false),
.init(title: "NHN, ์ž‘๋…„ ์˜์—…์ต 555์–ต์›...์ „๋…„๋น„ 42% โ†‘", date: "2023๋…„2์›”13์ผ", image: "https://cdnimage.dailian.co.kr/news/202402/news_1707866329_1327972_m_1.png", content: "2NHN์€ ์—ฐ๊ฒฐ๊ธฐ์ค€ ์ง€๋‚œํ•ด ์˜์—…์ด์ต์ด 555์–ต์›์œผ๋กœ ์ „๋…„ ๋Œ€๋น„ 42.2% ์ฆ๊ฐ€ํ–ˆ๋‹ค๊ณ  14์ผ ๋ฐํ˜”๋‹ค.๊ฐ™์€ ๊ธฐ๊ฐ„ ๋งค์ถœ์€ 7.3% ์ฆ๊ฐ€ํ•œ 2์กฐ2696์–ต์›์œผ๋กœ ์—ฐ๊ฐ„ ์ตœ๋Œ€์น˜๋ฅผ ๊ธฐ๋กํ–ˆ๋‹ค. ์ž‘๋…„ 4๋ถ„๊ธฐ ๋งค์ถœ์€ 5983์–ต์›์œผ๋กœ ์ „๋…„ ๋™๊ธฐ ๋Œ€๋น„ 6.7% ์˜ฌ๋ž๋‹ค. ๋ฐ˜๋ฉด ์˜์—…์†์‹ค์€ 78์–ต์›์œผ๋กœ ์ ์ž์ „ํ™˜ํ–ˆ๋‹ค. ์ปค๋จธ์Šค ๋ถ€๋ฌธ์˜ ์žฅ๊ธฐ ๋ฏธํšŒ์ˆ˜์ฑ„๊ถŒ ๋Œ€์†์ƒ๊ฐ๋น„ ์ธ์‹๊ณผ ๊ธฐ์ˆ  ๋ถ€๋ฌธ์˜ ๊ธฐ ์ธ์‹ ๋งค์ถœ ์ฐจ๊ฐ ๋“ฑ ์ผํšŒ์„ฑ ์š”์ธ์ด ์˜ํ–ฅ์„ ๋ฏธ์ณค๋‹ค.", isBookmarked: false),

.init(title: "์ด์ข…ํ˜ธ ๊ณผ๊ธฐ์žฅ๊ด€ 5๋…„ ๋’ค ๊ตฌ์ถ•๋  ๋ฐ”์ด์˜คํŒŒ์šด๋“œ๋ฆฌ์— ์‚ฐํ•™์—ฐ ์—ญ๋Ÿ‰ ๋ชจ์•„์•ผ", date: "2023๋…„3์›”13์ผ", image: "https://imgnews.pstatic.net/image/003/2024/03/05/NISI20231030_0001398722_web_20231030141808_20240305103108748.jpg?type=w647", content: "์ •๋ถ€๊ฐ€ ๋‚ด๋…„๋ถ€ํ„ฐ ํ•ฉ์„ฑ์ƒ๋ฌผํ•™์˜ ํ•„์ˆ˜ ์ธํ”„๋ผ์ธ '๊ตญ๊ฐ€ ๋ฐ”์ด์˜คํŒŒ์šด๋“œ๋ฆฌ' ๊ตฌ์ถ•์— ๋ณธ๊ฒฉ ๋‚˜์„œ๋Š” ๊ฐ€์šด๋ฐ ์ด์ข…ํ˜ธ ๊ณผํ•™๊ธฐ์ˆ ์ •๋ณดํ†ต์‹ ๋ถ€ ์žฅ๊ด€์ด ํ•œ๊ตญ์ƒ๋ช…๊ณตํ•™์—ฐ๊ตฌ์›์—์„œ ์šด์˜ ์ค‘์ธ ์‚ฌ์ „์—ฐ๊ตฌ์šฉ ์‹œ์„ค์„ ์ฐพ์•„ ๊ตฌ์ฒด์ ์ธ ์ธํ”„๋ผ ๊ตฌ์ถ• ๊ณ„ํš ๋“ฑ์„ ์ ๊ฒ€ํ–ˆ๋‹ค.์ด ์žฅ๊ด€์€ 5์ผ ํ•ฉ์„ฑ์ƒ๋ฌผํ•™ ์œก์„ฑ์„ ์œ„ํ•ด ๋ฐ”์ด์˜คํŒŒ์šด๋“œ๋ฆฌ ์—ฐ๊ตฌํ˜„์žฅ์„ ๋ฐฉ๋ฌธํ•˜๊ณ , ์‚ฐยทํ•™ยท์—ฐ ์ „๋ฌธ๊ฐ€๋“ค์„ ๋งŒ๋‚ฌ๋‹ค. ์ด๋ฒˆ ๋ฐฉ๋ฌธ์€ ์ง€๋‚œํ•ด ๋ฏธ๊ตญ, ์˜๊ตญ๊ณผ์˜ ์ •์ƒํšŒ๋‹ด ์‹œ ๋…ผ์˜๋๋˜ ์ฒจ๋‹จ๋ฐ”์ด์˜ค ํ˜‘๋ ฅ์„ ์œ„ํ•œ ํ›„์†์กฐ์น˜์˜ ์ผํ™˜์œผ๋กœ ์ถ”์ง„๋๋‹ค.", isBookmarked: false),
.init(title: "SW์‚ฐ์—… ์œก์„ฑ์— 7308์–ต ์˜ˆ์‚ฐํˆฌ์ž, SaaS ๋“ฑ ์œก์„ฑ", date: "2023๋…„3์›”13์ผ", image: "https://imgnews.pstatic.net/image/008/2024/03/05/0005007507_001_20240305135301539.jpg?type=w647", content: "SW(์†Œํ”„ํŠธ์›จ์–ด) ์‚ฐ์—…์˜ SaaS(์„œ๋น„์Šคํ˜• ์†Œํ”„ํŠธ์›จ์–ด) ์ „ํ™˜ ๋“ฑ SW์‚ฐ์—… ์œก์„ฑ์„ ์œ„ํ•ด ์ •๋ถ€ ์˜ˆ์‚ฐ 7308์–ต์›์ด ํˆฌ์ž๋œ๋‹ค. ๊ฐ•๋„ํ˜„ ๊ณผํ•™๊ธฐ์ˆ ์ •๋ณดํ†ต์‹ ๋ถ€ ์ œ2์ฐจ๊ด€์€ 5์ผ ์˜ค์ „ ์„œ์šธ ์„์ง€๋กœ ๋”์กด๋น„์ฆˆ์˜จ ์„์ง€์‚ฌ์˜ฅ์—์„œ ์—ด๋ฆฐ 'AI(์ธ๊ณต์ง€๋Šฅ) ์ผ์ƒํ™”, SW๋„ ์ด์ œ ์„œ๋น„์Šคํ˜• SW'๋ผ๋Š” ์ฃผ์ œ๋กœ ์—ด๋ฆฐ ํ˜„์žฅ ๊ฐ„๋‹ดํšŒ์—์„œ ์ •๋ถ€๋„ ๋Œ€ํ•œ๋ฏผ๊ตญ SW์‚ฐ์—…์˜ ๋ฏธ๋ž˜๊ฐ€ SaaS์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์˜ฌํ•ด 'SaaS ํ˜์‹ ํŽ€๋“œ'๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์กฐ์„ฑํ•˜๋Š” ๋“ฑ SaaS ์œก์„ฑ ๋ฐ ๊ธฐ์กด SW ๊ธฐ์—…์˜ SaaS ์ „ํ™˜์„ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์ง€์›์„ ์ถ”์ง„ ์ค‘์ด๋ผ๋ฉฐ ์ด๊ฐ™์ด ๋ฐํ˜”๋‹ค.", isBookmarked: false),
.init(title: "ํŒŒ์ˆ˜, ๊ธฐ์—…์šฉ AI โ€˜์—”ํ„ฐํ”„๋ผ์ด์ฆˆ LLMโ€™ ์ถœ์‹œ", date: "2023๋…„3์›”13์ผ", image: "https://imgnews.pstatic.net/image/018/2024/03/05/0005685566_001_20240305103201036.jpg?type=w647", content: "2NHN์€ ์—ฐ๊ฒฐ๊ธฐ์ค€ ์ง€๋‚œํ•ด ์˜์—…์ด์ต์ด 555์–ต์›์œผ๋กœ ์ „๋…„ ๋Œ€๋น„ 42.2% ์ฆ๊ฐ€ํ–ˆ๋‹ค๊ณ  14์ผ ๋ฐํ˜”๋‹ค.๊ฐ™์€ ๊ธฐ๊ฐ„ ๋งค์ถœ์€ 7.3% ์ฆ๊ฐ€ํ•œ 2์กฐ2696์–ต์›์œผ๋กœ ์—ฐ๊ฐ„ ์ตœ๋Œ€์น˜๋ฅผ ๊ธฐ๋กํ–ˆ๋‹ค. ์ž‘๋…„ 4๋ถ„๊ธฐ ๋งค์ถœ์€ 5983์–ต์›์œผ๋กœ ์ „๋…„ ๋™๊ธฐ ๋Œ€๋น„ 6.7% ์˜ฌ๋ž๋‹ค. ๋ฐ˜๋ฉด ์˜์—…์†์‹ค์€ 78์–ต์›์œผ๋กœ ์ ์ž์ „ํ™˜ํ–ˆ๋‹ค. ์ปค๋จธ์Šค ๋ถ€๋ฌธ์˜ ์žฅ๊ธฐ ๋ฏธํšŒ์ˆ˜์ฑ„๊ถŒ ๋Œ€์†์ƒ๊ฐ๋น„ ์ธ์‹๊ณผ ๊ธฐ์ˆ  ๋ถ€๋ฌธ์˜ ๊ธฐ ์ธ์‹ ๋งค์ถœ ์ฐจ๊ฐ ๋“ฑ ์ผํšŒ์„ฑ ์š”์ธ์ด ์˜ํ–ฅ์„ ๋ฏธ์ณค๋‹ค.", isBookmarked: false),
.init(title: "NHN, ์ž‘๋…„ ์˜์—…์ต 555์–ต์›...์ „๋…„๋น„ 42% โ†‘", date: "2023๋…„2์›”13์ผ", image: "https://cdnimage.dailian.co.kr/news/202402/news_1707866329_1327972_m_1.png", content: "2NHN์€ ์—ฐ๊ฒฐ๊ธฐ์ค€ ์ง€๋‚œํ•ด ์˜์—…์ด์ต์ด 555์–ต์›์œผ๋กœ ์ „๋…„ ๋Œ€๋น„ 42.2% ์ฆ๊ฐ€ํ–ˆ๋‹ค๊ณ  14์ผ ๋ฐํ˜”๋‹ค.๊ฐ™์€ ๊ธฐ๊ฐ„ ๋งค์ถœ์€ 7.3% ์ฆ๊ฐ€ํ•œ 2์กฐ2696์–ต์›์œผ๋กœ ์—ฐ๊ฐ„ ์ตœ๋Œ€์น˜๋ฅผ ๊ธฐ๋กํ–ˆ๋‹ค. ์ž‘๋…„ 4๋ถ„๊ธฐ ๋งค์ถœ์€ 5983์–ต์›์œผ๋กœ ์ „๋…„ ๋™๊ธฐ ๋Œ€๋น„ 6.7% ์˜ฌ๋ž๋‹ค. ๋ฐ˜๋ฉด ์˜์—…์†์‹ค์€ 78์–ต์›์œผ๋กœ ์ ์ž์ „ํ™˜ํ–ˆ๋‹ค. ์ปค๋จธ์Šค ๋ถ€๋ฌธ์˜ ์žฅ๊ธฐ ๋ฏธํšŒ์ˆ˜์ฑ„๊ถŒ ๋Œ€์†์ƒ๊ฐ๋น„ ์ธ์‹๊ณผ ๊ธฐ์ˆ  ๋ถ€๋ฌธ์˜ ๊ธฐ ์ธ์‹ ๋งค์ถœ ์ฐจ๊ฐ ๋“ฑ ์ผํšŒ์„ฑ ์š”์ธ์ด ์˜ํ–ฅ์„ ๋ฏธ์ณค๋‹ค.", isBookmarked: false),
.init(title: "NHN, ์ž‘๋…„ ์˜์—…์ต 555์–ต์›...์ „๋…„๋น„ 42% โ†‘", date: "2023๋…„2์›”13์ผ", image: "https://cdnimage.dailian.co.kr/news/202402/news_1707866329_1327972_m_1.png", content: "2NHN์€ ์—ฐ๊ฒฐ๊ธฐ์ค€ ์ง€๋‚œํ•ด ์˜์—…์ด์ต์ด 555์–ต์›์œผ๋กœ ์ „๋…„ ๋Œ€๋น„ 42.2% ์ฆ๊ฐ€ํ–ˆ๋‹ค๊ณ  14์ผ ๋ฐํ˜”๋‹ค.๊ฐ™์€ ๊ธฐ๊ฐ„ ๋งค์ถœ์€ 7.3% ์ฆ๊ฐ€ํ•œ 2์กฐ2696์–ต์›์œผ๋กœ ์—ฐ๊ฐ„ ์ตœ๋Œ€์น˜๋ฅผ ๊ธฐ๋กํ–ˆ๋‹ค. ์ž‘๋…„ 4๋ถ„๊ธฐ ๋งค์ถœ์€ 5983์–ต์›์œผ๋กœ ์ „๋…„ ๋™๊ธฐ ๋Œ€๋น„ 6.7% ์˜ฌ๋ž๋‹ค. ๋ฐ˜๋ฉด ์˜์—…์†์‹ค์€ 78์–ต์›์œผ๋กœ ์ ์ž์ „ํ™˜ํ–ˆ๋‹ค. ์ปค๋จธ์Šค ๋ถ€๋ฌธ์˜ ์žฅ๊ธฐ ๋ฏธํšŒ์ˆ˜์ฑ„๊ถŒ ๋Œ€์†์ƒ๊ฐ๋น„ ์ธ์‹๊ณผ ๊ธฐ์ˆ  ๋ถ€๋ฌธ์˜ ๊ธฐ ์ธ์‹ ๋งค์ถœ ์ฐจ๊ฐ ๋“ฑ ์ผํšŒ์„ฑ ์š”์ธ์ด ์˜ํ–ฅ์„ ๋ฏธ์ณค๋‹ค.", isBookmarked: false),
.init(title: "NHN, ์ž‘๋…„ ์˜์—…์ต 555์–ต์›...์ „๋…„๋น„ 42% โ†‘", date: "2023๋…„2์›”13์ผ", image: "https://cdnimage.dailian.co.kr/news/202402/news_1707866329_1327972_m_1.png", content: "2NHN์€ ์—ฐ๊ฒฐ๊ธฐ์ค€ ์ง€๋‚œํ•ด ์˜์—…์ด์ต์ด 555์–ต์›์œผ๋กœ ์ „๋…„ ๋Œ€๋น„ 42.2% ์ฆ๊ฐ€ํ–ˆ๋‹ค๊ณ  14์ผ ๋ฐํ˜”๋‹ค.๊ฐ™์€ ๊ธฐ๊ฐ„ ๋งค์ถœ์€ 7.3% ์ฆ๊ฐ€ํ•œ 2์กฐ2696์–ต์›์œผ๋กœ ์—ฐ๊ฐ„ ์ตœ๋Œ€์น˜๋ฅผ ๊ธฐ๋กํ–ˆ๋‹ค. ์ž‘๋…„ 4๋ถ„๊ธฐ ๋งค์ถœ์€ 5983์–ต์›์œผ๋กœ ์ „๋…„ ๋™๊ธฐ ๋Œ€๋น„ 6.7% ์˜ฌ๋ž๋‹ค. ๋ฐ˜๋ฉด ์˜์—…์†์‹ค์€ 78์–ต์›์œผ๋กœ ์ ์ž์ „ํ™˜ํ–ˆ๋‹ค. ์ปค๋จธ์Šค ๋ถ€๋ฌธ์˜ ์žฅ๊ธฐ ๋ฏธํšŒ์ˆ˜์ฑ„๊ถŒ ๋Œ€์†์ƒ๊ฐ๋น„ ์ธ์‹๊ณผ ๊ธฐ์ˆ  ๋ถ€๋ฌธ์˜ ๊ธฐ ์ธ์‹ ๋งค์ถœ ์ฐจ๊ฐ ๋“ฑ ์ผํšŒ์„ฑ ์š”์ธ์ด ์˜ํ–ฅ์„ ๋ฏธ์ณค๋‹ค.", isBookmarked: false),
]
) {
self.bookmarkList = bookmarkList
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,16 @@ struct BookmarkView: View {
Spacer()

HStack {
Image(bookmark.image)
.frame(width: 100, height: 100)
.clipShape(
RoundedRectangle(cornerRadius: 15)
)
AsyncImage(url: URL(string: bookmark.image)) { image in
image
.resizable()
.scaledToFill()
.frame(width: 150, height: 150)
.clipShape(RoundedRectangle(cornerRadius: 15))

} placeholder: {
Image("photo.circle.fill")
}
Spacer()
}
.padding(.bottom, 30)
Expand Down Expand Up @@ -66,5 +71,5 @@ struct BookmarkView: View {
}

#Preview {
BookmarkView(bookmark: .init(title: "2024๋…„ โ€˜์†Œ์…œ ๋ฏธ๋””์–ด ๋‹ค์ด์–ดํŠธโ€™๋ฅผ ์œ„ํ•ด ๋ฐ”๊ฟ”๋ณผ ๊ฒƒ", date: "2023๋…„12์›”3์ผ", image: "exampleNews", content: "2024๋…„์œผ๋กœ ์ ‘์–ด๋“ ์ง€ ํ•œ ๋‹ฌ์ด ๋„˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜ฌ ํ•ด๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜๋Ÿฌ๊ฐˆ์ง€ ์˜ˆ์ธกํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค. ํ•œ ๊ฐ€์ง€ ํ™•์‹คํ•œ ๊ฒƒ์€ ์ •์น˜์ ์œผ๋กœ ๋งค์šฐ ์ค‘์š”ํ•œ ํ•ด๋ผ๋Š” ์ ์ด๋‹ค. ๋ฏธ๊ตญ๊ณผ ๋Ÿฌ์‹œ์•„, ์šฐํฌ๋ผ์ด๋‚˜, ๋ฐฉ๊ธ€๋ผ๋ฐ์‹œ, ์ธ๋„, ๋Œ€๋งŒ, ํ•œ๊ตญ, ๋‚จ์•„ํ”„๋ฆฌ์นด๊ณตํ™”๊ตญ, ์œ ๋Ÿฝ์˜ํšŒ, ์˜๊ตญ์—์„œ ์„ ๊ฑฐ๊ฐ€ ์น˜๋Ÿฌ์งˆ ์˜ˆ์ •์ด๋‹ค.", isBookmarked: false))
BookmarkView(bookmark: .init(title: "NHN, ์ž‘๋…„ ์˜์—…์ต 555์–ต์›...์ „๋…„๋น„ 42% โ†‘", date: "2023๋…„2์›”13์ผ", image: "https://cdnimage.dailian.co.kr/news/202402/news_1707866329_1327972_m_1.png", content: "2NHN์€ ์—ฐ๊ฒฐ๊ธฐ์ค€ ์ง€๋‚œํ•ด ์˜์—…์ด์ต์ด 555์–ต์›์œผ๋กœ ์ „๋…„ ๋Œ€๋น„ 42.2% ์ฆ๊ฐ€ํ–ˆ๋‹ค๊ณ  14์ผ ๋ฐํ˜”๋‹ค.๊ฐ™์€ ๊ธฐ๊ฐ„ ๋งค์ถœ์€ 7.3% ์ฆ๊ฐ€ํ•œ 2์กฐ2696์–ต์›์œผ๋กœ ์—ฐ๊ฐ„ ์ตœ๋Œ€์น˜๋ฅผ ๊ธฐ๋กํ–ˆ๋‹ค. ์ž‘๋…„ 4๋ถ„๊ธฐ ๋งค์ถœ์€ 5983์–ต์›์œผ๋กœ ์ „๋…„ ๋™๊ธฐ ๋Œ€๋น„ 6.7% ์˜ฌ๋ž๋‹ค. ๋ฐ˜๋ฉด ์˜์—…์†์‹ค์€ 78์–ต์›์œผ๋กœ ์ ์ž์ „ํ™˜ํ–ˆ๋‹ค. ์ปค๋จธ์Šค ๋ถ€๋ฌธ์˜ ์žฅ๊ธฐ ๋ฏธํšŒ์ˆ˜์ฑ„๊ถŒ ๋Œ€์†์ƒ๊ฐ๋น„ ์ธ์‹๊ณผ ๊ธฐ์ˆ  ๋ถ€๋ฌธ์˜ ๊ธฐ ์ธ์‹ ๋งค์ถœ ์ฐจ๊ฐ ๋“ฑ ์ผํšŒ์„ฑ ์š”์ธ์ด ์˜ํ–ฅ์„ ๋ฏธ์ณค๋‹ค.", isBookmarked: false))
}
Loading