์ˆํผํ”Œ๋ ˆ์ด(์œ ํŠœ๋ธŒ์‡ผ์ธ , ๋ฌด๋ฃŒ ๋™์˜์ƒ)
Hello! I am a mobile app developer and leader with more than 10 years of experience. In particular, I havedeveloped video streaming Android apps and live related services, and I am working to grow video OTT service apps and player SDKs with development team members, value user feedback, value data, and promote organizational and corporate profits based on technology.

ํ”Œ๋Ÿฌํ„ฐ ์›น(Flutter Web)์—์„œ ๊ตฌ๊ธ€ ์• ๋“œ์„ผ์Šค(AdSense) ๊ด‘๊ณ  ์ ์šฉํ•˜๋Š” ์‹ค์ „ ๋ฐฉ๋ฒ•๊ณผ ์ฃผ์˜์‚ฌํ•ญ

 ํ”Œ๋Ÿฌํ„ฐ ์›น(Flutter Web)์—์„œ ๊ตฌ๊ธ€ ์• ๋“œ์„ผ์Šค(AdSense) ๊ด‘๊ณ ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์‹ค์ œ๋กœ ๊ฒช์–ด๋ณธ ์‹ค๋ฌด์  ์ด์Šˆ, ๊ทธ๋ฆฌ๊ณ  ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

์ผ๋‹จ ์ฃผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS ๋“ฑ ํด๋ผ์ด์–ธํŠธ ์•ฑ ๊ฐœ๋ฐœ์„ ์ค‘์‹ฌ์œผ๋กœ ํ•ด์™”์œผ๋‚˜, ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ์ด์šฉํ•œ ์›น ๊ฐœ๋ฐœ ๋ฐ ๊ด‘๊ณ  ์ ์šฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ง์ ‘ ์ง„ํ–‰ํ•ด๋ดค๊ธฐ์—, ์ด ๊ฒฝํ—˜์ด ๋น„์Šทํ•œ ๊ณ ๋ฏผ์„ ํ•˜๋Š” ๋ถ„๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž€๋‹ค.


ํ”Œ๋Ÿฌํ„ฐ๋กœ ์›น ์„œ๋น„์Šค, ์‹ค์ œ ์‹ค๋ฌด ์ ์šฉ์€ ๊ฐ€๋Šฅํ• ๊นŒ?

ํ”Œ๋Ÿฌํ„ฐ(Flutter)๋กœ ์›น ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ๋Š”, ๊ตฌ๊ธ€์˜ ํฌ๋กœ์Šคํ”Œ๋žซํผ ๊ฐœ๋ฐœ ๋„๊ตฌ๋กœ์„œ์˜ ์žฅ์  ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ ์šฉํ•ด๋ณด๋‹ˆ, ํ”Œ๋Ÿฌํ„ฐ ์›น์€ ๋กœ๋”ฉ ์†๋„, ์—๋Ÿฌ ํŠธ๋ž˜ํ‚น์˜ ๋ถˆํŽธํ•จ ๋“ฑ ์—ฌ๋Ÿฌ ํ•œ๊ณ„์ ์ด ๋ถ„๋ช… ์กด์žฌํ–ˆ๋‹ค. ๊ธฐ์กด์—  ์“ด ๊ธ€ ์ฐธ๊ณ 

ํ˜„์žฌ ์ด์Šˆ ํ‚ค์›Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ์œ ํŠœ๋ธŒ ์ˆ์ธ (Shorts) ์˜์ƒ์„ ๋…ธ์ถœํ•˜๋Š” ์›น์„ ํ”Œ๋Ÿฌํ„ฐ๋กœ ์ œ์ž‘ํ•˜์—ฌ ์šด์˜ ์ค‘์ด๋‹ค.

์‚ฌ์‹ค ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ด‘๊ณ ๋ฅผ ๋ถ™์ด๋ ค๋˜ ๊ฑด ์•„๋‹ˆ์—ˆ์œผ๋‚˜, ‘ํ”Œ๋Ÿฌํ„ฐ ์›น์—์„œ๋Š” ๊ด‘๊ณ  ์ ์šฉ์ด ์–ด๋ ต๋‹ค’๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ˆ๋˜ ํ„ฐ๋ผ, ์ง์ ‘ ์‹œ๋„ํ•ด๋ณด๊ณ  ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๋Š” ๊ฒŒ ์˜๋ฏธ์žˆ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.


๊ตฌ๊ธ€ ์• ๋“œ์„ผ์Šค ์Šน์ธ, ๊ทธ๋ฆฌ๊ณ  ์„œ๋ธŒ๋„๋ฉ”์ธ ์ ์šฉ

์• ๋“œ์„ผ์Šค(AdSense) ์Šน์ธ์€ ์ด๋ฏธ ๋ฉ”์ธ ๋„๋ฉ”์ธ์œผ๋กœ ์ ์šฉํ•œ ์ƒํƒœ์ด๋‹ค. ์ฐธ๊ณ ๋กœ, ์—๋“œ์„ผ์Šค๋Š” ๋ฉ”์ธ ๋„๋ฉ”์ธ์œผ๋กœ ์Šน์ธ์„ ๋ฐ›์€ ๊ฒฝ์šฐ ์„œ๋ธŒ๋„๋ฉ”์ธ์—๋Š” ๋ณ„๋„์˜ ์Šน์ธ ์—†์ด ๊ด‘๊ณ  ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ์ด๋ฏธ ์Šน์ธ์„ ๋ฐ›์€ ์ƒํ™ฉ์„ ์ „์ œ๋กœ, ์‹ค์ „ ์ ์šฉ ๊ณผ์ •์„ ์†Œ๊ฐœํ•œ๋‹ค.

์—๋“œ์„ผ์Šค ์Šน์ธ ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ ๋…ธํ•˜์šฐ๋Š” ๋งŽ์€ ์ž๋ฃŒ๋“ค์„ ์ฐพ์•„๋ณด๋ฉด ์žˆ์–ด์„œ ์—ฌ๊ธฐ์„œ๋Š” ๋…ผ์™ธ๋กœ ํ•œ๋‹ค.


ํ”Œ๋Ÿฌํ„ฐ ์›น์—์„œ ๊ตฌ๊ธ€ ์• ๋“œ์„ผ์Šค ์ ์šฉ์ด ์–ด๋ ค์šด ์ด์œ 

ํ”Œ๋Ÿฌํ„ฐ ์›น์€ SPA(Single Page Application) ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ๋ชจ๋“  UI๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋™์ ์œผ๋กœ ๋žœ๋”๋ง๋œ๋‹ค.

์ด ๋•Œ๋ฌธ์— ๊ตฌ๊ธ€ ์• ๋“œ์„ผ์Šค ๊ด‘๊ณ  ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•ด๋„ ๋ฐ”๋กœ ๊ด‘๊ณ ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๊ฑฐ๋‚˜, ์•„์˜ˆ ์•ˆ ๋ณด์ด๋Š” ํ˜„์ƒ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.๊ฒŒ๋‹ค๊ฐ€ ์ •์  HTML์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ด‘๊ณ ๊ฐ€ ์•ˆ ๋ณด์ผ ๋•Œ ์ด์Šˆ์˜ ์›์ธ์„ ํŠธ๋ž˜ํ‚นํ•˜๊ธฐ๋„ ์‰ฝ์ง€ ์•Š๋‹ค.


๊ด€๋ จ ์ •๋ณด๋‚˜ ํ•ด๊ฒฐ ์‚ฌ๋ก€๋„ ๋งŽ์ง€ ์•Š์•„์„œ, ChatGPT์™€ ๊ฐ™์€ AI ๋„๊ตฌ์˜ ๋„์›€์„ ๋ฐ›์•„๋„ ์‹ค์ œ ๊ด‘๊ณ ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋‹ค.


์•ฑ(AdMob),Google IMA ๊ฐ™์€ ๊ฒƒ๊ณผ ๋น„๊ต

๋ชจ๋ฐ”์ผ ์•ฑ์˜ ๊ฒฝ์šฐ ๊ตฌ๊ธ€ AdMob์„ SDK๋กœ ์—ฐ๋™ํ•˜๋Š” ๊ฒŒ ํ‘œ์ค€์ด๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‘๋‹ต ๋ฉ”์‹œ์ง€๋กœ ์•ˆ๋‚ด๊ฐ€ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น…๋„ ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฝ๋‹ค.

๋ฐ˜๋ฉด, ์›น(ํŠนํžˆ ํ”Œ๋Ÿฌํ„ฐ ์›น)์€ SPA ๊ตฌ์กฐ์˜ ํ•œ๊ณ„๋กœ ์ธํ•ด ๊ด‘๊ณ  ์ ์šฉ๊ณผ ๋””๋ฒ„๊น… ๋ชจ๋‘ ๊นŒ๋‹ค๋กญ๋‹ค.


๊ตฌ๊ธ€ ์• ๋“œ์„ผ์Šค ๊ด‘๊ณ  ํƒœ๊ทธ ์ƒ์„ฑ

๊ด‘๊ณ  ์ ์šฉ์„ ์œ„ํ•ด ์• ๋“œ์„ผ์Šค์— ์ ‘์†ํ•ด  ‘๋””์Šคํ”Œ๋ ˆ์ด ๊ด‘๊ณ ’ ๋‹จ์œ„๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.๊ด‘๊ณ ๋Š” ’๋ฐ˜์‘ํ˜•(Responsive)’์œผ๋กœ ๋งŒ๋“ค์—ˆ๊ณ , ์ƒ์„ฑ ํ›„ ์ œ๊ณต๋˜๋Š” HTML ํƒœ๊ทธ๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค.


๊ด‘๊ณ  ํด๋ฆญ -> ๊ด‘๊ณ  ๋‹จ์œ„ ๊ธฐ์ค€ -> ๋””์Šคํ”Œ๋ ˆ์ด ๊ด‘๊ณ -> ์ƒ์„ฑ 


๊ด‘๊ณ ์ƒ์„ฑ๊ณผ์ •


ํ”Œ๋Ÿฌํ„ฐ ์›น์—์„œ ์• ๋“œ์„ผ์Šค ๊ด‘๊ณ  ์œ„์ ฏ ๋งŒ๋“ค๊ธฐ


ํ”Œ๋Ÿฌํ„ฐ ์›น์—์„œ  ์ ์šฉํ•ด ๋ณด๊ธฐ ์œ„ํ•ด gpt ๋ฅผ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž.



import 'dart:html';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';

class AdsenseBannerWidget extends StatefulWidget {
  final String adClient; // ex: "ca-pub-xxxx..."
  final String adSlot;   // ex: "1234567890"
  final double width;
  final double height;

  const AdsenseBannerWidget({
    Key? key,
    required this.adClient,
    required this.adSlot,
    this.width = 320,
    this.height = 100,
  }) : super(key: key);

  @override
  State createState() => _AdsenseBannerWidgetState();
}

class _AdsenseBannerWidgetState extends State {
  final String _viewType = 'adsense-html-banner';

  @override
  void initState() {
    super.initState();
    if (kIsWeb) {
      // ๋ฐ˜๋“œ์‹œ // ignore: undefined_prefixed_name ๋ถ™์—ฌ ์‚ฌ์šฉ
      // ignore: undefined_prefixed_name
      ui.platformViewRegistry.registerViewFactory(
        '$_viewType-${widget.adSlot}',
            (int viewId) {
          // ๊ด‘๊ณ  ์ฝ”๋“œ HTML
          final htmlString = '''
            
            
          ''';
          final element = DivElement()
            ..setInnerHtml(
              htmlString,
              validator: NodeValidatorBuilder()..allowElement('script')..allowElement('ins'),
            );
          // ๊ด‘๊ณ  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—†์œผ๋ฉด ์ถ”๊ฐ€ (์ค‘๋ณต๋กœ๋“œ ๋ฐฉ์ง€)
          if (document.querySelectorAll('script[src*="pagead2.googlesyndication.com"]').isEmpty) {
            final script = ScriptElement()
              ..async = true
              ..src = "https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=${widget.adClient}"
              ..setAttribute('crossorigin', 'anonymous');
            document.head!.append(script);
          }
          return element;
        },
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return
      Container(color: Colors.red, child:SizedBox( width: widget.width,height: widget.height));
  }
}


์ด๋ ‡๊ฒŒ ์œ„์ ฏ์„ ๋งŒ๋“ค์–ด์„œ ๊ด‘๊ณ ๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๋ ค ํ–ˆ์œผ๋‚˜, ์‹ค์ œ๋กœ๋Š” ๊ด‘๊ณ ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์•˜๋‹ค.

๊ด‘๊ณ ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ ์ฒ˜๋Ÿผ AppTopBar ํ•˜๋‹จ์— ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.


๊ด‘๊ณ ์•ˆ๋‚˜์˜ด



์• ๋“œ์„ผ์Šค ํ”Œ๋Ÿฌ๊ทธ์ธ/ํŒจํ‚ค์ง€ ํƒ์ƒ‰


ํ˜น์‹œ ๊ธฐ์กด์— ๋ˆ„๊ตฐ๊ฐ€ ๋งŒ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š”์ง€ pub.dev์—์„œ ๊ฒ€์ƒ‰ํ•ด๋ดค์œผ๋‚˜, ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค.

https://pub.dev/packages? q=platform%3 Aweb+adsense&sort=downloads




๊ฒฐ๊ตญ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ์ชฝ์œผ๋กœ ๋ฐฉํ–ฅ์„ ์žก์•˜๋‹ค.



ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Iframe์œผ๋กœ ๊ด‘๊ณ  HTML ๋กœ๋”ฉ


ํ”Œ๋Ÿฌํ„ฐ ์›น์—์„œ ๊ด‘๊ณ ๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ๋…ธ์ถœํ•˜๋ ค๋ฉด, ๋ณ„๋„์˜ HTML ํŒŒ์ผ(์˜ˆ: adsense_banner.html)์„ ์ƒ์„ฑํ•ด ์—์…‹(assets) ํด๋”์— ์ถ”๊ฐ€ํ•˜๊ณ , ์ด๋ฅผ iframe์œผ๋กœ ๋กœ๋”ฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ ํ•˜์˜€๋‹ค




    
    





์‹ค์ œ ๊ด‘๊ณ ๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ํŠนํžˆ ๊ด‘๊ณ  ์œ„/์•„๋ž˜ ๋ ˆ์ด์•„์›ƒ์ด ๊นจ์ง€์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด ๋†’์ด๋ฅผ 70px ๋กœ ๊ณ ์ •ํ•ด ์ฃผ์—ˆ๋‹ค. 70px ๋Š”  ๋ฐ˜์‘ํ˜•์ด ์•„๋‹Œ๊ฑธ๋กœ ์ถ”๊ฐ€ ํ•˜๋ คํ• ๋•Œ ์ œ์ผ ํฐ ๋†’์ด๋ผ ์ผ๋‹จ 70px ๋กœ ํ•˜์˜€๋‹ค.


import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:ui' as ui;
import 'dart:html' as html;

class AdsenseBannerAssetWidget extends StatefulWidget {
  final double width;
  final double height;

  const AdsenseBannerAssetWidget({
    Key? key,
    this.width = 400,
    this.height = 100,
  }) : super(key: key);

  @override
  State createState() => _AdsenseBannerAssetWidgetState();
}

class _AdsenseBannerAssetWidgetState extends State {
  late final String _viewType;

  @override
  void initState() {
    super.initState();
    _viewType = 'adsense-banner-iframe-${widget.width}-${widget.height}-${UniqueKey()}';

    if (kIsWeb) {
      // ignore: undefined_prefixed_name (ํ”Œ๋Ÿฌํ„ฐ ๋ฒ„์ „์— ๋”ฐ๋ฅธ ๋ฌด์‹œ)
      ui.platformViewRegistry.registerViewFactory(
        _viewType,
            (int viewId) {
            //iframe ์œผ๋กœ ๋ฆฌํ„ด
          final iframe = html.IFrameElement()
            ..width = widget.width.toInt().toString()
            ..height = widget.height.toInt().toString()
            ..src = '/assets/adsense_banner.html'
            ..style.border = 'none';
          return iframe;
        },
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    if (!kIsWeb) return const SizedBox();
    return SizedBox(
      width: widget.width,
      height: widget.height,
      child: HtmlElementView(
        viewType: _viewType,
      ),
    );
  }
}
๊ด‘๊ณ ๋‚˜์˜ด



6. ํ…Œ์ŠคํŠธ์™€ ๋ฐฐํฌ


ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” ๊ด‘๊ณ ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋…ธ์ถœ๋˜๋Š”์ง€, ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”์ง€๊นŒ์ง€ ๊ผญ ์ฒดํฌํ•ด์•ผ ํ•œ๋‹ค.

ํŠนํžˆ ์—๋“œ์„ผ์Šค๋Š” ‘ํ…Œ์ŠคํŠธ ๊ด‘๊ณ ’๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์‹ค ์„œ๋น„์Šค ๋„๋ฉ”์ธ์—์„œ๋งŒ ๊ด‘๊ณ ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.

ํ…Œ์ŠคํŠธ๊ด‘๊ณ  ์ ์šฉ


๋กœ์ปฌํ™˜๊ฒฝ์—์„œ๋Š” ๊ด‘๊ณ ๊ฐ€ ๋นˆ ์˜์—ญ์œผ๋กœ๋งŒ ๋‚˜์˜ค๋‹ˆ, ์‹ค์ œ ๋ฐฐํฌ ์ „์—๋Š” ๋ฐ˜๋“œ์‹œ ๋ฐฐํฌ์šฉ ๋„๋ฉ”์ธ์—์„œ ์ตœ์ข… ํ™•์ธ์„ ํ•ด์•ผ ํ•œ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋Š” ์—๋“œ์„ผ์Šค ์ƒ˜ํ”Œ ์•„๋‹ˆ์ง€๋งŒ ์ผ๋‹จ ํด๋ฆญ์ด๋ฒคํŠธ๊ฐ€ ์ž˜ ๋จนํžˆ๋Š”์ง€ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์ˆ˜์žˆ๋Š” html ์ด๋‹ค.



์•„๋ž˜ ์ฒ˜๋Ÿผ ์ ์ ˆํ•œ ๊ณณ์— ํ•ด๋‹น ์œ„์…‹์„ ์‹คํ–‰ํ•œ๋‹ค.

Column(
        mainAxisAlignment: MainAxisAlignment.center,
        mainAxisSize: MainAxisSize.min,
        children: [
                Container(
                  margin: EdgeInsets.only(top:_topBarHeight),
                  width: double.infinity,
                  height: 70,
                  child: AdsenseBannerAssetWidget(
                   width: MediaQuery.of(context).size.width,
                   height: 70
                  ),
                ),
                videoview widget..
                ]
                
.....



๊ฒฝํ—˜ ๊ธฐ๋ฐ˜ ๊ฒฐ๋ก  ๋ฐ ์ฃผ์˜์‚ฌํ•ญ

  • ํ”Œ๋Ÿฌํ„ฐ ์›น์€ ๊ด‘๊ณ  ์ ์šฉ์ด ์‰ฝ์ง€ ์•Š๋‹ค. SPA ๊ตฌ์กฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋žœ๋”๋ง ํŠน์„ฑ ๋•Œ๋ฌธ์— ์• ๋“œ์„ผ์Šค๊ฐ€ ๋ฐ”๋กœ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • Iframe ๋ฐฉ์‹์ด ํ˜„์‹ค์ ์ธ ๋Œ€์•ˆ์ด๋‹ค. ๋ณ„๋„์˜ HTML์„ ๋งŒ๋“ค์–ด assets๋กœ ์ถ”๊ฐ€ํ•˜๊ณ , ์ด๋ฅผ iframe์œผ๋กœ ๋กœ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ๊น”๋”ํ•˜๋‹ค.

  • ํ…Œ์ŠคํŠธ ๊ด‘๊ณ ๋Š” ๋”ฐ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ถ€์ • ํด๋ฆญ ์ฃผ์˜(์ง์ ‘ ํด๋ฆญ X)

  • ๋กœ์ปฌ์—์„œ๋Š” ๊ด‘๊ณ ๊ฐ€ ์•ˆ ๋‚˜์˜ด. ์‹ค ์„œ๋น„์Šค ๋„๋ฉ”์ธ์—์„œ๋งŒ ์ •์ƒ ๋™์ž‘

  • ํ”Œ๋Ÿฌํ„ฐ ์›น์€ ์‹ค๋ฌด/์ƒ์šฉ ์„œ๋น„์Šค์— ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ. MVP, ํ”„๋กœํ† ํƒ€์ž… ์ •๋„๋กœ๋Š” ์“ธ๋งŒํ•˜๋‚˜, ๋А๋ฆฐ ์†๋„, ํ•œ๊ธ€ ํฐํŠธ ๊นจ์ง, ๋””๋ฒ„๊น… ์–ด๋ ค์›€ ๋“ฑ ํ•œ๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜๋‹ค.

  • ์• ๋“œ์„ผ์Šค ๊ด‘๊ณ  ๋‹จ์œ„/์œ„์น˜๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ ๊ฒฐ์ •. ์•ต์ปค ๊ด‘๊ณ (์ƒ/ํ•˜๋‹จ) ๊ฒน์นจ ๋“ฑ ์ด์Šˆ ์ฃผ์˜.


๋งˆ์น˜๋ฉฐ

๊ฒฝํ—˜ํ•œ ํ”Œ๋Ÿฌํ„ฐ ์›น์—์„œ ๊ตฌ๊ธ€ ์• ๋“œ์„ผ์Šค ๊ด‘๊ณ  ์ ์šฉ ๋ฐฉ๋ฒ•๊ณผ ๋ฌธ์ œ ํ•ด๊ฒฐ ์‚ฌ๋ก€๋ฅผ ๊ณต์œ ํ–ˆ๋‹ค.

ํ˜น์‹œ๋‚˜ ์—๋“œ์„ผ์Šค ๊ด‘๊ณ ๋ฅผ ์ ์šฉํ•˜๋ ค ๊ณ ๋ฏผํ•˜๋Š” ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค์—๊ฒŒ ์‹ค์ œ๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ํ•ด๋ฒ•์ด ๋˜๊ธธ ๋ฐ”๋ž€๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ํ”Œ๋Ÿฌํ„ฐ ์›น์€ ์•„์ง ์›น ์‹ค๋ฌด์—์„œ๋Š” ๋น„์ถ”์ฒœ์ด์ง€๋งŒ, ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๊ด‘๊ณ ๊นŒ์ง€ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค๋ฉด iframe ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ ํ–ˆ๊ณ  ์ •์ƒ ์ ์œผ๋กœ ์ง€ํ‘œ๊ฐ€ ๋‚˜์˜ค๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•ด๋ณด๋ ค ํ•œ๋‹ค.


๋Œ“๊ธ€ ์“ฐ๊ธฐ