<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>geon_0.log</title>
        <link>https://velog.io/</link>
        <description>중요한건 꺾이지 않는 마음</description>
        <lastBuildDate>Tue, 07 Nov 2023 02:53:16 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>geon_0.log</title>
            <url>https://velog.velcdn.com/images/geon_0/profile/5cec59f1-8edd-49d8-aa7b-9361180c4089/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. geon_0.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/geon_0" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[JAVA 면접 질문 정리]]></title>
            <link>https://velog.io/@geon_0/JAVA-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@geon_0/JAVA-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Tue, 07 Nov 2023 02:53:16 GMT</pubDate>
            <description><![CDATA[<h3 id="자바의-특징">자바의 특징</h3>
<ol>
<li>OOP(객체 지향 언어) </li>
<li>&quot;가비지 컬렉션&quot;에 의한 메모리 자동 관리</li>
<li>&quot;멀티 쓰레드&quot;를 지원한다.</li>
<li>JVM 위에서 동작하기 때문에 특정 OS에 종속적이지 않고 이식성이 좋으며, 보안성이 좋다.</li>
</ol>
<h3 id="변수란">변수란?</h3>
<ul>
<li>&quot;하나의 값을 저장할 수 있는 메모리 공간&quot;</li>
</ul>
<h3 id="객체와-클래스의-차이점">객체와 클래스의 차이점</h3>
<ul>
<li>*<em>객체(Object) *</em>
Class라는 설계도를 기반으로 실제 메모리가 잡힌 것을 의미</li>
</ul>
<ul>
<li>*<em>클래스(Class) *</em>
현실 세계의 객체의 속성과 동작을 추려내 필드와 메서드로 정의한 것으로
&quot;아직 메모리가 할당되지 않은 상태&quot;</li>
</ul>
<h3 id="객체-지향-특징">객체 지향 특징</h3>
<ul>
<li><p>현실세계의 객체를 필드와 메서드로 정의한 Class를 기반으로 실제 메모리가 잡혀 만들어진 부품과 같은 객체들을 조합하여 프로그램을 만듬</p>
</li>
<li><p>캡슐화, 은닉화 : 외부 객체에서 구현방식은 알 수 없도록 숨기고 별도로 접근할 수 있는 getter/setter 메서드를 통해 접근하도록 하는 방식</p>
</li>
<li><p>상속 : 부모 Class를 자식이 접근할 수 있도록 물려 받는 방식</p>
</li>
<li><p>다형성 : 부모 클래스 타입으로 해당 부모를 상속받는 여러 자식 class를 대입할 수 있는 성질</p>
</li>
</ul>
<h3 id="자바의-메모리-영역">자바의 메모리 영역</h3>
<p><img src="https://velog.velcdn.com/images/geon_0/post/9e2ba6ef-995a-470b-8ee6-c4c51fe26421/image.png" alt=""></p>
<ol>
<li>메서드 영역 : static 변수, 전역변수, 코드에서 사용되는 Class 정보 등이 올라간다.</li>
<li>스택(Stack) : 지역변수, 함수(메서드) 등이 할당되는 LIFO(Last In First Out) 방식의 메모리</li>
<li>힙(Heap) : new 연산자를 통한 동작할당된 객체들이 저장되며, 가비지 컬렉션에 의해 메모리가 관리되어 진다.</li>
</ol>
<h3 id="추상-메서드-추상-클래스">추상 메서드, 추상 클래스</h3>
<ul>
<li>추상 메서드 : 메서드의 정의부만 있고 구현부는 있지 않은 메서드</li>
<li>추상 클래스 : 추상메서드를 적어도 하나 이상 가지고 있는 클래스로 자식클래스에서 오버라이딩(재정의)가 필요한 추상메서드를 가지고 있기 때문에 객체화 할 수 없음.</li>
</ul>
<h3 id="인터페이스interface">인터페이스(Interface)</h3>
<ul>
<li><p>인터페이스는 한마디로 말하자면 일종의 추상 클래스다. 추상 클래스처럼 추상메서드를 갖지만, 추상 클래스보다 추상화 정도가 높아서 추상 클래스와 달리 추상 메서드와 상수만을 멤버로 가질 수 있다.</p>
<pre><code>inerface MyInterface {
    public static final int number = 0;
    public abstract method();
}</code></pre><p>이런 식으로 인터페이스의 모든 멤버변수는 public static final이고, 모든 메서드는 public abstract이다. 이렇게 전체적인 틀을 짜준 후, 실제 구현 클래스에서 메서드 내용 부분을 채워넣어 구현(implements)을 해주는 것이다.<br>추상 클래스를 부분적으로만 완성된 미완성 설계도라고 한다면 인터페이스는 밑그림만 그려져 있는 기본 설계도라고 할 수 있다.</p>
</li>
</ul>
<h3 id="왜-인터페이스를-사용하는가">왜 인터페이스를 사용하는가? </h3>
<p>  ✅ 표준화가 가능하다
  아까부터 틀이라는 단어를 계속 사용하고 있는데, 이렇게 인터페이스로 틀을 잡아 놓고 개발을 하게 되면 여러 명의 개발자가 작업을 할 때도 일관된 틀안 에서 그 안의 내용을 구현하면서 개발이 진행되므로 정형화된 작업이 가능하다.</p>
<p>  ✅ 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다
  서로 상속(extends)관계도 아니고 조상 클래스도 갖고 있지 않은 아무런 관계도 없는 클래스들이 하나의 인터페이스를 공통적으로 구현하게 하면 관계를 맺어줄 수 있다.</p>
<p>  ✅ 독립적인 프로그래밍이 가능하다
  클래스의 선언(interface &gt; Service)과 구현(class &gt; ServiceImpl)을 분리시킴으로써 독립적인 프로그래밍이 가능하다. 만약 모든 클래스들을 직접 관계로 한다면, 한 클래스를 변경할 때마다 직접 관계로 맺어진 클래스를 모두 수정해야 할 것이다. 하지만 선언과 구현을 나누면서 간접적인 관계로 변경하면, 하나의 클래스를 변경하더라도 다른 클래스에 영향을 미치지 않게 된다.</p>
<h3 id="프로세스process-와-쓰레드thread의-차이점">프로세스(Process) 와 쓰레드(Thread)의 차이점</h3>
<ul>
<li>프로세스 : OS가 메모리 등의 자원을 할당해준 실행중인 프로그램을 가리킨다. 이때, 각각의 프로세스는 서로 메모리 공간을 독자적으로 갖기 때문에 서로 메모리 공간을 공유하지 못한다. 따라서 공유하기 위해서 IPC(InterProcess Communication)과 같은 방식이 필요하다.</li>
<li>쓰레드 : 쓰레드는 프로세스 내에서 프로세스의 자원을 가지고 실제로 일하는 &quot;일꾼&quot;과 같으며 각 쓰레드는 독자적인 Stack 메모리를 갖고 그 외의 자원(메모리)는 프로세스 내에서 공유하게 된다.</li>
</ul>
<h3 id="컬렉션프레임워크collectionframework">컬렉션프레임워크(CollectionFramework)</h3>
<p>*<em>Collection 인터페이스 *</em></p>
<ul>
<li>List 인터페이스 : 배열과 유사하되, 추가할때마다 자동으로 Boundary를 늘려주는 구조로, 중복된 데이터를 허용하며, 순서가 존재한다.</li>
<li>ArrayList : 배열로 구현됬으며, 인접해 있기 때문에 데이터 조회에 매우 빠르다 하지만, 빈번한 삽입, 삭제시 새로 배열을 만들고 데이터를
옮겨야 하기 때문에 LinkedList에 비하여 속도가 느리다.</li>
<li>LinkedList : 링크 구조로 되어 있기 때문에 조회는 ArrayList에 비해 느리지만, 삽입 삭제시 링크를 끊고 새로 추가되는 데이터에 링크만
연결하면 되기 때문에 삽입, 삭제에 유리하다.</li>
<li>Vector : 구현 방식은 ArrayList와 유사하지만 Vector를 개선한 것
Vector의 경우에는 ArrayList와 달리 Synchronized(동기화)가 걸려 있어 여러 쓰레드에서 동시에 접근할 수 없다.</li>
<li>Set 인터페이스 : 집합처럼 중복된 데이터를 허용하지 않으며, 순서가 없다. 또한, 객체 내부의 중복된 데이터를 배제하고 싶은 경우 Object 클래스의 equals 메서드와 hashCode 메서드의 재정의가 반드시 필요하다.</li>
<li>HashSet</li>
<li>TreeSet : 순서가 있는 HashSet으로 이진 트리 구조로 만들어 졌다. 순서에 맞게 정렬되어 저장되기 위해서 Comparable을 구현해야한다.</li>
<li>Map 인터페이스 : key와 value 쌍으로 데이터를 저장하며, key는 중복될 수 없고, value는 중복 저장이 가능하다.</li>
<li>HashMap</li>
<li>TreeMap</li>
<li>Properties : key value 쌍으로 저장되지만 value의 타입이 String만 가능하다.</li>
<li>Hashtable : HashMap과 구조는 같으며, 단지 Synchronized(동기화) 되어져 있다는 점이 다른점이다.<h3 id="캐시cache와-세션session">캐시(Cache)와 세션(Session)</h3>
</li>
<li>공통점 : 둘 다 사용자의 데이터를 저장한다.</li>
<li>차이점 :
  1) 캐시 : 캐시는 Client 컴퓨터에 저장했다 서버 요청시 네트워크를 타고 서버로 전달되기 때문에 보안에 취약하다.
2) 세션 : 세션은 서버에 저장되고 브라우저 단위로 관리된다. 캐시에 비해 보안성이 좋다.</li>
</ul>
<h3 id="request-전송-방식">Request 전송 방식</h3>
<ul>
<li>Get 방식 : URL의 쿼리문자열에 데이터를 같이 전달하는 방식으로 데이터 길이에 제한이 있고, 보안에 취약하다.</li>
<li>POST 방식 : 헤더에 데이터를 넣어 보내기 때문에 보안에 조금 더 유리하고 데이터 길이에 제한이 없다. 하지만, Get에 비해 다소 느리다.</li>
<li>DELETE 방식 : RESTFUL에서 삭제 기능을 할 때 주로 사용된다.</li>
<li>PUT/PUSH 방식 : RESTFUL에서 수정 작업을 할 때 주로 사용된다.</li>
</ul>
<h3 id="restful이란">RESTFUL이란?</h3>
<p>: 해당 URL만 보더라도 바로 어떤 작업을 하는지를 알 수 있도록 하나의 데이터는 하나의 URL을 갖도록 작업하는 방식</p>
<h3 id="spring-di">Spring DI</h3>
<p>A : DI는 Dependency Injection(의존성 주입)의 약자로, 객체들 간의 의존성을 줄이기 위해 사용되는 Spring의 IOC 컨테이너의 구체적인 구현 방식입니다. DI는 기존처럼 개발코드 부분에서 객체를 생성하는 것이 아니라, 팩토리 패턴처럼 객체의 생성과, 데이터를 주입만 담당하는 Factory에 해당 하는 별도의 공간에서 객체를 생성하고 데이터간의 의존성을 주입해 개발코드에서는 이를 가져다 씀으로서 의존성을 줄이는 방식입니다. 이때, Factory 패턴의 Factory Class의 역할을 스프링의 환경설정 파일이 담당합니다.</p>
<h3 id="spring의-aop란">Spring의 AOP란?</h3>
<p>A : AOP는 Aspect Oriented Programming 관점 지향 프로그래밍의 약자로, 기존의 OOP(객체 지향 프로그래밍)에서 기능별로 class를 분리했음에도 불구하고, 여전히 로그, 트랜잭션, 자원해제, 성능테스트 메서드 처럼 공통적으로 반복되는 중복코드가 여전히 발생하는 단점을 해결하고자 나온 방식으로 이러한 공통 코드를 &quot;횡단 관심사&quot;라 표현하며 개발코드에서는 비지니스 로직에 집중하고 실행시에 비지니스 로직 앞, 뒤 등 원하는 지점에 해당 공통 관심사를 수행할 수 있게 함으로서 중복 코드를 줄일 수 있는 방식입니다.</p>
<h3 id="17-filter와-interceptor-방식의-차이">17. Filter와 Interceptor 방식의 차이?</h3>
<p>A : 필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.
인터셉터(Interceptor)는 J2EE 표준 스펙인 필터(Filter)와 달리 Spring이 제공하는 기술로써, 디스패처 서블릿(Dispatcher Servlet)이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다. 즉, 웹 컨테이너(서블릿 컨테이너)에서 동작하는 필터와 달리 인터셉터는 스프링 컨텍스트에서 동작을 하는 것이다.
<img src="https://velog.velcdn.com/images/geon_0/post/59cf8e5a-d1fe-4879-a82d-36580d813fae/image.png" alt=""></p>
<h3 id="18-디자인-패턴-아는-것">18. 디자인 패턴 아는 것?</h3>
<p>1) 싱글톤(SingleTone Pattern) : 대표적으로 Calendar 객체나 dataSource 객체처럼 객체가 하나만 생성되어야 하는 경우 전체 코드에서 하나의 객체만 존재할 수 있도록 이미 생성된 객체가 있으면 그 객체를 사용하도록 하는 방식입니다.
2) 팩토리 패턴(Factory pattern) : 객체간 의존성을 줄이기 위해 객체의 생성과 데이터 주입만 담당하는 Factory Class를 정의하고 개발 코드 부분에서는 생성된 객체를 가져다 사용함으로서 의존성을 줄이는 방식입니다.
3) 옵저버 패턴(Observer Pattern) : 기후 정보처럼 RSS 수신시 하나의 객체가 변하면 다른 객체에 객체가 변했다는 사항을 알려주어야 할 경우에 주로 사용됩니다.</p>
<h3 id="19-mvc-패턴이란">19. MVC 패턴이란?</h3>
<ul>
<li>Model : data 처리와 접근을 담당</li>
<li>View : Client에 보여지는 화면을 담당</li>
<li>Controller : Model과 View를 제어
하는 3가지 부분으로 나눔으로서, 데이터와 화면간의 의존관계를 벗어날 수 있게하는 개발 기법입니다.</li>
</ul>
<h3 id="20-프로젝트-개발-순서">20. 프로젝트 개발 순서</h3>
<p>1) 요구사항 분석 
기획 및 스토리 보드 작성
2) WBS(Work Breakdown Structure) 작성 : 작업 분해도로 프로젝트 범위와 최종산출물을 세부요소로 분할한 계층적 구조도
3) 논리 ERD 작성
4) 물리 ERD 작성
5) 개발
6) Testing
7) 유지보수</p>
<h3 id="21-오버로딩과-오버라이딩의-차이">21. 오버로딩과 오버라이딩의 차이?</h3>
<ul>
<li>오버로딩 : 메서드 명은 동일하지만, 매개 변수 타입과 개수를 다르게 해 선언하는 방식</li>
<li>오버라이딩 : 상속한 자식에서 부모의 메서드를 재정의하는 방식</li>
</ul>
<h3 id="22-servlet-vs-jsp">22. Servlet vs JSP</h3>
<ul>
<li>Servlet : 자바 언어로 웹 개발을 위해 만들어진 것으로, Container가 이해할 수 있게 구성된 순수 자바코드로만 이루어진 것</li>
<li>JSP : html 기반에 JAVA 코드를 블록화하여 삽입한 것으로 Servlet을 좀 더 쉽게 접근할 수 있도록 만들어 진 것</li>
</ul>
<h3 id="23-wrapper-class의-사용이유를-아나요">23. Wrapper Class의 사용이유를 아나요?</h3>
<p>: 기본 data 타입은 객체가 아니어서 Object로 받는 다형성을 지원할 수가 없다. 하지만, 메서드에서 실재로 기본데이터 타입을 다형성으로 넘겨주어야 하는 경우가 빈번히 발생하는데 이때, 기본 데이터 타입을 객체로 변환시켜 전달하기 위해 사용됩니다.</p>
<h3 id="24-database에서-index란">24. DataBase에서 Index란?</h3>
<p>A : Table에 대한 동작 속도를 높여주는 자료구조로서 빠른 검색을 가능하게 해준다.</p>
<h3 id="25-private-protected-public-default-제어자에-대해-설명해-보시오">25. private, protected, public, default 제어자에 대해 설명해 보시오</h3>
<ul>
<li>private : 같은 class 내부에서&quot;만&quot; 접근이 가능하다.</li>
<li>public : 어디서든 자유롭게 접근이 가능하다.</li>
<li>protected : 같은 class 내부 + 상속받은 자식에서는 부모 class에 접근이 가능하다.</li>
<li>default : 아무 것도 선언하지 않은 경우로 같은 패키지 내부에서만 접근이 가능하다.</li>
</ul>
<h3 id="26-자바의-제네릭이란">26. 자바의 제네릭이란??</h3>
<p>A : 클래스 내부에서 사용할 데이터 타입을 인스턴스(객체) 생성시에 결정짓는 방식
 </p>
<h3 id="27-프로세스와-쓰레드의-차이점에-대해서-설명해-보시오">27. 프로세스와 쓰레드의 차이점에 대해서 설명해 보시오.</h3>
<p>A : 프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고, 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위
 </p>
<h3 id="28-데드락-이란-무엇이고-이를-해결하기-위한-방법을-설명해-보시오">28. ‘데드락’ 이란 무엇이고 이를 해결하기 위한 방법을 설명해 보시오.</h3>
<p>A : 프로세스가 자원을 얻지 못해 다음 처리를 진행하지 못하는 상태, 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생함.
은행원 알고리즘 : 프로세스가 자원을 요구할 때 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지를 사전에 검사하여 교착 상태를 회피하는 기법
 </p>
<h3 id="29-변수-명명법이-중요한-이유에-대해서-설명하고-예를-들어-보시오">29. 변수 명명법이 중요한 이유에 대해서 설명하고 예를 들어 보시오.</h3>
<p>A : 변수 이름을 정할 때 가장 중요한 것은 가독성입니다. 변수 이름이 의미를 명확하게 전달해야 코드를 읽는 사람이 쉽게 이해할 수 있습니다. 의미 있는 이름을 사용하면, 코드를 처음 접하는 사람도 변수의 용도를 쉽게 파악할 수 있음
 </p>
<h3 id="30-자바의-jvm의-역할에-대해서-설명해-보시오">30. 자바의 JVM의 역할에 대해서 설명해 보시오.</h3>
<p>A : JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다.그리고 JVM은 Java와 OS(운영체제) 사이에서 중개자 역할을 수행하여 Java가 OS(운영체제)에 구애받지 않고 독립적으로 작동이 가능하다. 또한 가장 중요한 메모리 관리, Garbage collection(가비지 컬렉션)을 수행한다.
 </p>
<h3 id="31-linux에서-톰캣-환경설정">31. Linux에서 톰캣 환경설정</h3>
<p>A : wget 명령어로 다운로드 -&gt; tar 압축 해지 -&gt; vi 사용하여 tomcat 환경변수 설정
 </p>
<h3 id="32-was와-웹서버의-차이점은">32. WAS와 웹서버의 차이점은?</h3>
<p>A : 웹서버는 정적인 데이터를 처리하는 서버입니다. 이미지나 단순 html 같은 정적인 리소스들을 전달하며 WAS만을 이용할 경우보다 빠르고 안정적으로 기능을 수행합니다.</p>
<p>A : WAS는 동적인 데이터를 위주로 처리하는 서버입니다. DB와 연결되어 사용자와 데이터를 주고받고 조작이 필요한 경우 WAS를 활용합니다.
 </p>
<h3 id="33-jquery와-ajax에-대해-아는가">33. Jquery와 Ajax에 대해 아는가?</h3>
<p>A : jQuery는 HTML의 DOM 조작과 이벤트 제어, 애니메이션 그리고 Ajax까지 웹 화면을 다루는 자바스크립트 라이브러리
A : 브라우저가 가지고있는 XMLHttpRequest 객체를 이용해서 전체 페이지를 새로 고치지 않고도 페이지의 일부만을 위한 데이터를 로드하는 기법이며, JavaScript를 사용한 비동기 통신, 클라이언트와 서버간에 XML 데이터를 주고받는 기술이다.
 </p>
<h3 id="34-비동기와-동기-방식의-차이점에-대해서-말해보시오">34. 비동기와 동기 방식의 차이점에 대해서 말해보시오.</h3>
<p>A : 비동기란 특정 코드가 끝날때 까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행하는 것을 의미한다. 
병렬적으로 태스크를 수행하는 방식이다. 비동기 처리를 예로 Web API, Ajax, setTimeout 등이 있다.
이때, 비동기 요청시 응답 후 처리할 &#39;콜백 함수&#39;를 함께 알려준다. 따라서 해당 태스크가 완료되었을 때, &#39;콜백 함수&#39;가 호출된다.하지만 비동기 처리를 위해 콜백 패턴을 사용하면 처리 순서를 보장하기 위해 여러 개의 콜백 함수가 중첩되어 복잡도가 높아지는 콜백 헬(Callback Hell) 이 발생하는 단점이 있다.</p>
<p>A : 동기는 직렬적으로 태스크를 수행하는 방식이다.즉, 요청을 보낸 후 응답을 받아야지만 다음 동작이 이루어지는 방식이다. 어떠한 태스크를 처리할 동안 나머지 태스크는 대기한다. 실제로 cpu가 느려지는 것은 아니지만 시스템의 전체적인 효율이 저하된다고 할 수 있다.
 </p>
<h3 id="35-에자일-방법론에-대해서-아는가">35. ‘에자일’ 방법론에 대해서 아는가?</h3>
<p>A :  계획 → 설계(디자인) → 개발(발전) → 테스트 → 검토(피드백) 순으로 반복적으로 진행
먼저 진행 후 분석, 시험, 피드백을 통하여 개선하여 나가는 진행 모델이다.
 </p>
<h3 id="36-스프링-환경설정">36. 스프링 환경설정</h3>
<p>ant, maven, gradle
 </p>
<h3 id="37-웹서버-내부-구동-방식에-대해-설명할-수-있는가">37. 웹서버 내부 구동 방식에 대해 설명할 수 있는가?</h3>
<p>A : Web Server는 클라이언트가 HTML, CSS 와 같은 정적 데이터를 요청하면 앞단에서 빠르게 제공하고, 동적 데이터가 필요하면 WAS 에 요청을 보내고, WAS 가 처리한 데이터를 클라이언트에 전달한다.
NginX 는 바로 이 Web Server 의 구축을 도와주는 소프트웨어이다
 
 </p>
<h3 id="38-db-옵티마이저에-대해-아는가">38. DB 옵티마이저에 대해 아는가?</h3>
<p>A : 옵티마이저는 SQL을 가장 빠르고 효율적으로 수행할 최적의 처리경로를 생성해 주는 DBMS 내부의 핵심 엔진</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA 면접 질문 리스트]]></title>
            <link>https://velog.io/@geon_0/JAVA-%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@geon_0/JAVA-%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 30 Oct 2023 06:26:34 GMT</pubDate>
            <description><![CDATA[<h3 id="was-vs-ws">WAS VS WS</h3>
<ul>
<li><p>WAS(Web Application Server)
1) 비즈니스 로직을 넣을 수 있음
ex) Tomcat, PHP, ASP, .NET</p>
</li>
<li><p>WS(Web Server)
1) 비즈니스 로직을 넣을 수 없음
ex) Nginx, Apache</p>
</li>
</ul>
<h3 id="spring-framework에-대해-설명해주세요">Spring Framework에 대해 설명해주세요.</h3>
<ul>
<li><p>스프링 프레임워크는 자바 개발을 편리하게 해주는 오픈소스 프레임워크</p>
</li>
<li><p>경량 컨테이너로서 자바 객체를 직접 관리
1) 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 
스프링으로부터 필요한 객체를 얻어올 수 있다.</p>
</li>
<li><p>제어의 역전(IoC)이라는 기술을 통해 어플리케이션의 느슨한 결합을 도모
1) 컨트롤의 제어권이 사용자가 아닌 프레임워크에 있어서 필요에 따라서
스프링에서 사용자의 코드를 호출한다.</p>
</li>
<li><p>의존성 주입(DI, Dependency Injection)을 지원
각각의 계층이나 서비스들 간에 의존성이 존재할 경우 
프레임워크가 서로 연결시켜준다.</p>
</li>
<li><p>관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)을 지원
트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.</p>
<h3 id="requestbody-requestparam-modelattribute">@RequestBody, @RequestParam, @ModelAttribute</h3>
</li>
<li><p>@RequestBody 
클라이언트가 전송하는 JSON 형태의 HTTP Body 내용을 MessageConverter를 통해 Java Object로 변환시켜주는 역할
값을 주입하지 않고 값을 변환 시키므로(Reflection을 사용해 할당), 변수들의 생성자, Getter,Setter가 없어도 정상적으로 할당된다.</p>
</li>
</ul>
<ul>
<li><p>@RequestParam 
1개의 HTTP 요청 파라미터를 받기 위해 사용 @RequestParam은 필수 여부가 true이기 때문에 기본적으로 반드시 해당 파라미터가 전송되어야 합니다. 전송되지 않으면 400Error를 유발할 수 있으며 반드시 필요한 변수가 아니라면 required의 값을 false로 설정해줘야 합니다.</p>
</li>
<li><p>@ModelAttribute 
HTTP Body 내용과 HTTP 파라미터의 값들을 생성자,Getter,Setter를 통해 주입하기 위해 사용, 값 변환이 아닌 값을 주입시키므로 변수들의 생성자나 Getter,Setter가 없으면 변수들이 저장되지 않는다.</p>
</li>
</ul>
<h3 id="spring-boot와-spring-framework의-차이점을-설명해주세요">Spring Boot와 Spring Framework의 차이점을 설명해주세요.</h3>
<ul>
<li>Auto Configuration의 차이 Spring은 프로젝트 초기에 다양한 환경설정을 해야 하지만 Spring Boot는 설정의 많은 부분을 자동화 내장된 톰캣을 제공해 서버를 바로 실행할 수 있습니다.</li>
</ul>
<h3 id="spring-mvc에-대해-설명해주세요">Spring MVC에 대해 설명해주세요.</h3>
<ul>
<li><p>MVC는 Model, View, Controller의 약자이며, 각 레이어간 기능을 구분하는데 중점을 둔 디자인 패턴
1) Model
데이터 관리 및 비즈니스 로직을 처리하는 부분이며, (DAO, DTO, Service 등)
2) View
비즈니스 로직의 처리 결과를 통해 유저 인터페이스가 표현되는 구간입니다. 
(html, jsp, tymeleaf, mustache 등 화면을 구성하기도 하고, Rest API로 서버가 구현된다면 json 응답으로 구성되기도 한다.)
3)Controller
사용자의 요청을 처리하고 Model과 View를 중개하는 역할을 합니다. Model과 View는 서로 연결되어 있지 않기 때문에 Controller가 사이에서 통신 매체가 되어줍니다.</p>
<h3 id="mvc는-어떠한-흐름으로-요청을-처리하는지-설명해주세요">MVC는 어떠한 흐름으로 요청을 처리하는지 설명해주세요.</h3>
</li>
<li><p>DispatcherServlet : 클라이언트에게 요청을 받아 응답까지의 MVC 처리과정을 통제한다.</p>
</li>
<li><p>HandlerMapping : 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정한다.</p>
</li>
<li><p>HandlerAdapter : HandlerMapping에서 결정된 핸들러 정보로 해당 메소드를 직접 호출해주는 역할을 한다.</p>
</li>
<li><p>ViewResolver : Controller의 처리 결과(데이터)를 생성할 view를 결정한다.</p>
</li>
<li><p>작동 방식</p>
<ol>
<li>클라이언트는 URL을 통해 요청을 전송한다.</li>
<li>디스패처 서블릿은 핸들러 매핑을 통해 해당 요청이 어느 컨트롤러에게 온 요청인지 찾는다.</li>
<li>디스패처 서블릿은 핸들러 어댑터에게 요청의 전달을 맡긴다.</li>
<li>핸들러 어댑터는 해당 컨트롤러에 요청을 전달한다.</li>
<li>컨트롤러는 비즈니스 로직을 처리한 후에 반환할 뷰의 이름을 반환한다.</li>
<li>디스패처 서블릿은 뷰 리졸버를 통해 반환할 뷰를 찾는다.</li>
<li>디스패처 서블릿은 컨트롤러에서 뷰에 전달할 데이터를 추가한다.</li>
<li>데이터가 추가된 뷰를 반환한다.</li>
</ol>
</li>
</ul>
<h3 id="제어의-역전ioc-inversion-of-control에-대해-아는대로-설명해주세요">제어의 역전(IoC, Inversion of Control)에 대해 아는대로 설명해주세요.</h3>
<ul>
<li>제어의 역전(IoC)란 모든 객체에 대한(생성, 라이프사이클 등) 제어권을 개발자가 아닌 IoC 컨테이너에게 넘긴 것을 말합니다. 스프링에서는 IoC 컨테이너에 객체들을 생성하면 객체끼리 의존성을 주입(DI, Dependency Injection)하는 역할을 하고 컨테이너에 등록한 객체들을 &#39;빈&#39;이라고 합니다.</li>
</ul>
<h3 id="스프링에서-빈bean을-등록하는-방법에-대해-말해보세요">스프링에서 빈(Bean)을 등록하는 방법에 대해 말해보세요.</h3>
<ul>
<li><p>@Component 어노테이션을 사용
@Controller, @Service, @Repository는 모두 @Component를 포함하고 있습니다.</p>
</li>
<li><p>설정 클래스를 따로 만들어 @Configuration 어노테이션을 붙이고,
해당 클래스 안에서 빈으로 등록할 메소드를 만들어 @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성됩니다.</p>
</li>
</ul>
<h3 id="의존성-주입di-dependency-injection에-대해-설명해주세요">의존성 주입(DI, Dependency Injection)에 대해 설명해주세요.</h3>
<ul>
<li><p>의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아서 사용하는 것입니다. 이를 통해 객체간의 결합도를 줄이고 코드의 재사용성을 높일 수 있습니다.</p>
</li>
<li><p>의존성 주입은 생성자 주입, 필드 주입, 세터 주입의 3 가지 방법이 있습니다. 이 중 Spring에서 가장 권장하는 의존성 주입 방법은 생성자를 통한 주입 방법입니다. </p>
</li>
</ul>
<h3 id="스프링-빈의-라이프사이클은-어떻게-관리되는지-설명해주세요">스프링 빈의 라이프사이클은 어떻게 관리되는지 설명해주세요.</h3>
<ul>
<li><p>스프링 IoC 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 메소드 호출 → 사용 → 소멸 전 콜백 메소드 호출 → 스프링 종료</p>
</li>
<li><p>스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 관리합니다.</p>
<ol>
<li>인터페이스( InitializingBean, DisposableBean )</li>
<li>설정 정보에 초기화 메소드, 종료 메소드 지정</li>
<li>@PostConstruct, @PreDestroy 어노테이션 지원</li>
</ol>
</li>
</ul>
<h3 id="관점지향-프로그래밍aop-aspect-oriented-programming는-무엇이고-언제-사용할-수-있을까요">관점지향 프로그래밍(AOP, Aspect Oriented Programming)는 무엇이고, 언제 사용할 수 있을까요?</h3>
<ul>
<li><p>AOP는 핵심 비즈니스 로직에 있는 공통 관심사항을 분리하여 각각을 모듈화 하는 것을 의미하며 공통 모듈인 인증, 로깅, 트랜잭션 처리에 용이합니다.</p>
</li>
<li><p>핵심 비즈니스 로직에 부가기능을 하는 모듈이 중복되어 분포되어 있을 경우 사용할 수 있습니다.</p>
</li>
<li><p>AOP의 가장 큰 특징이자 장점은 중복 코드 제거, 재활용성의 극대화, 변화수용의 용이성이 좋다는 점입니다.</p>
</li>
</ul>
<h3 id="lombok-라이브러리에-대해-알고-있나요-알고-있다면-롬복이-만드는-메소드들이-생성되는-시점은-언제인가요">Lombok 라이브러리에 대해 알고 있나요? 알고 있다면 롬복이 만드는 메소드들이 생성되는 시점은 언제인가요?</h3>
<ul>
<li>Lombok은 메소드를 컴파일 하는 과정에 개입해서 추가적인 코드를 만들어냅니다. 이것을 어노테이션 프로세싱이라고 하는데, 어노테이션 프로세싱은 자바 컴파일러가 컴파일 단계에서 어노테이션을 분석하고 처리하는 기법을 말합니다.</li>
</ul>
<h3 id="서블릿servlet에-대해-설명해주세요">서블릿(Servlet)에 대해 설명해주세요.</h3>
<ul>
<li>클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술입니다. Spring MVC에서 Controller로 이용되며, 사용자의 요청을 받아 처리한 후에 결과를 반환</li>
</ul>
<h3 id="vo와-bo-dao-dto에-대해-설명해주세요">VO와 BO, DAO, DTO에 대해 설명해주세요.</h3>
<ul>
<li>DAO(Data Access Object) DB의 데이터에 접근을 위한 객체를 말합니다. (Repository 또는 Mapper에 해당)</li>
<li>BO(Business Object) 여러 DAO를 활용해 비즈니스 로직을 처리하는 객체를 말합니다. (Service에 해당)</li>
<li>DTO(Data Transfer Object) 각 계층간의 데이터 교환을 위한 객체를 말합니다. (여기서 말하는 계층은 Controller, View, Business Layer, Persistent Layer)</li>
<li>VO (Value Object) 실제 데이터만을 저장하는 객체를 말합니다.</li>
</ul>
<h3 id="대용량-트래픽에서-장애가-발생하면-어떻게-대응할-것인가요">대용량 트래픽에서 장애가 발생하면 어떻게 대응할 것인가요?</h3>
<ul>
<li>스케일 업을 통해 하드웨어 스펙을 향상 / 스케일 아웃을 통해 서버를 여러대 추가해 시스템을 증가</li>
</ul>
<h3 id="spring의-싱글톤-패턴에-대해-설명해주세요">Spring의 싱글톤 패턴에 대해 설명해주세요.</h3>
<ul>
<li>스프링에서 bean 생성시 별다른 설정이 없으면 default로 싱글톤이 적용됩니다. 스프링은 컨테이너를 통해 직접 싱글톤 객체를 생성하고 관리하는데,
요청이 들어올 때마다 매번 객체를 생성하지 않고, 이미 만들어진 객체를 공유</li>
</ul>
<h3 id="spring의-스코프-프로토-타입-빈에-대해-설명해주세요">Spring의 스코프 프로토 타입 빈에 대해 설명해주세요.</h3>
<p>프로토타입 빈은 싱글톤(default bean) 빈과는 달리 컨테이너에게 빈을 요청할 때마다 매번 새로운 객체를 생성하여 반환해줍니다.
이렇게 빈의 scope를 간단하게 관리해줄 수 있는 것이 spring의 장점입니다.
빈의 scope 설정은 @Scope 어노테이션으로 설정하며, 프로토타입 scope로 설정하려면 @Scope(”prototype”)와 같이 문자열로 지정해줍니다.</p>
<h3 id="transactional의-동작-원리에-대해-설명해주세요">@Transactional의 동작 원리에 대해 설명해주세요.</h3>
<p>@Transactional을 메소드 또는 클래스에 명시하면, AOP를 통해 Target이 상속하고 있는 인터페이스 또는 Target 객체를 상속한 Proxy 객체가 생성되며, Proxy 객체의 메소드를 호출하면 Target 메소드 전 후로 트랜잭션 처리를 수행합니다.</p>
<h3 id="transactional를-스프링-bean의-메소드-a에-적용하였고-해당-bean의-메소드-b가-호출되었을-때-b-메소드-내부에서-a-메소드를-호출하면-어떤-요청-흐름이-발생하는지-설명해주세요">@Transactional를 스프링 Bean의 메소드 A에 적용하였고, 해당 Bean의 메소드 B가 호출되었을 때, B 메소드 내부에서 A 메소드를 호출하면 어떤 요청 흐름이 발생하는지 설명해주세요.</h3>
<p>프록시는 클라이언트가 타겟 객체를 호출하는 과정에만 동작하며, 타겟 객체의 메소드가 자기 자신의 다른 메소드를 호출할 때는 프록시가 동작하지 않습니다.
즉, A 메소드는 프록시로 감싸진 메소드가 아니므로 트랜잭션이 적용되지 않은 일반 코드가 수행됩니다.</p>
<h3 id="a-라는-service-객체의-메소드가-존재하고-그-메소드-내부에서-로컬-트랜잭션-3개다른-service-객체의-트랜잭션-메소드를-호출했다는-의미가-존재한다고-할-때-transactional을-a-메소드에-적용하면-어떤-요청-흐름이-발생하는지-설명해주세요">A 라는 Service 객체의 메소드가 존재하고, 그 메소드 내부에서 로컬 트랜잭션 3개(다른 Service 객체의 트랜잭션 메소드를 호출했다는 의미)가 존재한다고 할 때, @Transactional을 A 메소드에 적용하면 어떤 요청 흐름이 발생하는지 설명해주세요.</h3>
<p>트랜잭션 전파 수준에 따라 달라지는데, 만약 기본 옵션인 Required를 가져간다면 로컬 트랜잭션 3개가 모두 부모 트랜잭션인 A에 합류하여 수행됩니다.
그래서 부모 트랜잭션이나 로컬 트랜잭션 3개나 모두 같은 트랜잭션이므로 어느 하나의 로직에서 문제가 발생하면 전부 롤백이 됩니다.</p>
<p>Transaction 참고 자료</p>
<h3 id="transactional에-readonly-속성을-사용하는-이유에-대해서-설명해주세요">@Transactional에 readOnly 속성을 사용하는 이유에 대해서 설명해주세요.</h3>
<p>트랜잭션 안에서 수정/삭제 작업이 아닌 ReadOnly 목적인 경우에 주로 사용하며,
영속성 컨텍스트에서 엔티티를 관리 할 필요가 없기 때문에 readOnly를 추가하는 것으로 메모리 성능을 높일 수 있고,
데이터 변경 불가능 로직임을 코드로 표시할 수 있어 가독성이 높아진다는 장점이 있습니다.</p>
<p>readOnly 속성이 없는 보통의 트랜잭션은 데이터 조회 결과 엔티티가 영속성 컨텍스트에 관리되며,
이는 1차 캐싱부터 변경 감지(Dirty Checking)까지 가능하게 된다.
하지만, 조회시 스냅샷 인스턴스를 생성해 보관하기 때문에 메모리 사용량이 증가한다.</p>
<h3 id="jpa란">JPA란?</h3>
<ul>
<li><p>JPA는 자바 ORM(Object Relational Mapping) 기술에 대한 API 표준 명세를 뜻한다. 
 </p>
</li>
<li><p>ORM 기술이란? ORM 기술은 말 그대로 객체와 관계형 데이터 베이스를 매핑해 주는 기술이다.객체는 객체대로, 관계형 데이터베이스는 관계형 데이터베이스대로 설계하고, ORM 프레임워크가 중간에서 매핑을 해준다.</p>
</li>
<li><p>JPA는 라이브러리가 아닌 ORM을 사용하기 위한 인터페이스의 모음이다.
 이러한 JPA는 인터페이스의 모음, 단순한 명세이기 때문에 구현이 없다.</p>
</li>
<li><p>Hibernate는 JPA를 구현한 구현체이다. </p>
</li>
<li><p>JPA는 자바 진영의 ORM 기술에 대한 API 표준 명세이며
Hibernate는 JPA의 구현체이고, 내부적으로 JDBC를 이용한다.
Spring Data JPA는 JPA를 사용하기 쉽게 스프링에서 제공하는 모듈로 내부적으로 JPA 구현체를 이용한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[php 사용 보고서]]></title>
            <link>https://velog.io/@geon_0/php-%EC%82%AC%EC%9A%A9-%EB%B3%B4%EA%B3%A0%EC%84%9C</link>
            <guid>https://velog.io/@geon_0/php-%EC%82%AC%EC%9A%A9-%EB%B3%B4%EA%B3%A0%EC%84%9C</guid>
            <pubDate>Mon, 30 Oct 2023 04:07:52 GMT</pubDate>
            <description><![CDATA[<h3 id="php의-시작">php의 시작</h3>
<p>인터넷 초창기에는 Perl언어와 C언어를 사용하여 웹사이트를 제작하였으나 두 언어의 처리방식 때문에 문제가 발생. </p>
<p>클라이언트가 한명씩 접속할 때마다 하나의 프로세서 생성 -&gt; 접속하는 클라이언트 많아질수록 과부화가 심해짐</p>
<p>이에 다양한 웹언어들이 출현하기 시작함
처리방식을 클라이언트 한명씩 접속할때 하나의 프로세서를 만든 후, 그 안에 하나의 쓰레드를 하나씩 만들어 처리해줌 -&gt; 접속하는 클라이언트 많아져도 과부화 심해지지않음</p>
<p>PHP는 초기에 한 개인에 의해 개발되어 오픈소스화되어 유명해진 웹언어입니다. 먼저 C언어의 문법을 따라해 문법이 쉬우며 무료라서 사용하는데 돈이 들지 않으며 윈도우, LINUX, UNIX 등 여러 OS를 지원하여 플랫폼에 독립적입니다. 그리고 무료 OS인 LINUX에서 좀 더 빠르게 돌아가면서 무료 RDBMS인 MYSQL와 궁합이 잘 맞아
APM(APACHE+PHP+MYSQL)이라는 수식어를 가지고 다닙니다. 위의 3가지(APACHE+PHP+MYSQL) 프로그램은 모두 사용하는데 돈이 들지 않습니다.</p>
<h3 id="php-언어-특징">php 언어 특징</h3>
<ol>
<li>웹 서버에서 해석되는 스크립트 언어 (컴파일 과정이 없어서 편함)</li>
<li>데이터베이스 연동이 편리함 (mysql 연동이 엄청 편했음)</li>
<li>운영체제를 가리지 않고 구현가능함</li>
<li>코드작성 및 문법이 쉬움 (레퍼런스도 많이 있음)</li>
<li>Laravel 프레임워크를 사용하면 MVC 패턴으로 구현하기 편함</li>
<li>파일 업로드, 메일전송 등의 기본적인 기능을 자체적으로 지원한다. (PHP Mail()함수 등)</li>
<li>이미지 동적생성이 가능함 (GD 라이브러리 사용)</li>
<li>XML, ZIP, PDF, 암호화등 다양한 함수를 기본적으로 내장하고 있다 (컴포넌트 설치하지않아도 처리 가능)</li>
<li>오픈소스라서 무료이용이 가능하다.</li>
</ol>
<h3 id="laravel-특징">Laravel 특징</h3>
<ol>
<li>MVC 패턴 구현 편리</li>
<li>Query Builder를 통한 PBO 변수 바인딩 지원 (Sql Injection 공격으로부터 방어)</li>
<li>블레이드 템플릿을 사용하여 CSS 또는 XSS 공격 방어 (csrf_token() 함수를 통한 CSRF 방어)</li>
<li>페이징 처리 지원</li>
<li>public 폴더 노출 최소화 및 설정 파일 숨김</li>
<li>의존성 주입과 제어 역전 (Java Spring 프레임워크와 비슷함)</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA int long 차이]]></title>
            <link>https://velog.io/@geon_0/JAVA-int-long-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@geon_0/JAVA-int-long-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Mon, 30 Oct 2023 03:41:47 GMT</pubDate>
            <description><![CDATA[<h2 id="java의-int-및-long-유형">Java의 int 및 long 유형</h2>
<p>int 데이터 유형은 정수를 저장하는 Java의 기본 데이터 유형 
int의 크기는 4바이트이며, -2,147,483,648부터 2,147,483,647까지의 값 저장 가능</p>
<p>long 데이터 유형은 8바이트를 가진 Java의 기본 데이터 유형 
long 데이터 유형은 int가 보유할 수 없는 더 큰 정수를 보유하는 데 사용 -9,223,372,036,854,775,808부터 9,223,372,036,854,775,807까지의 값 저장 가능 long 데이터 유형의 값 뒤에 L을 작성하여 long 값을 나타낼 수 있음.</p>
<pre><code>long num = 15000000000L;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[PHP Laravel]]></title>
            <link>https://velog.io/@geon_0/PHP-Laravel</link>
            <guid>https://velog.io/@geon_0/PHP-Laravel</guid>
            <pubDate>Thu, 26 Oct 2023 09:28:01 GMT</pubDate>
            <description><![CDATA[<h2 id="php-laravel">PHP Laravel</h2>
<p>라라벨은 PHP 프레임워크로써 테일러 오트웰이 개발하였으며 
MVC(model - view - controller)패턴에 따라 웹 애플리케이션을 개발함.</p>
<h2 id="설치-방법">설치 방법</h2>
<p>컴포저로 라라벨 디렉토리를 설치</p>
<pre><code>composer create-project --prefer-dist laravel/laravel laravelTest</code></pre><p>로컬 환경에서 아티즌 명령어를 사용하여 개발 서버를 시작</p>
<pre><code>php artisan serve</code></pre><h2 id="디렉토리-구조">디렉토리 구조</h2>
<pre><code>├─app
│  ├─Console
│  ├─Exceptions
│  ├─Http
│  │  ├─Controllers
│  │  │  └─Auth
│  │  └─Middleware
│  └─Providers
├─bootstrap
│  └─cache
├─config
├─database
│  ├─factories
│  ├─migrations
│  └─seeds
├─public
│  ├─css
│  └─js
├─resources
│  ├─js
│  │  └─components
│  ├─lang
│  │  └─en
│  ├─sass
│  └─views
├─routes
├─storage
│  ├─app
│  │  └─public
│  ├─framework
│  │  ├─cache
│  │  │  └─data
│  │  ├─sessions
│  │  ├─testing
│  │  └─views
│  └─logs
├─tests
│  ├─Feature
│  └─Unit
└─vendor</code></pre><h3 id="app">app</h3>
<p>라라벨 애플리케이션의 핵심코드</p>
<p>Http/Controllers에 클래스를 넣어 사용</p>
<h3 id="bootstrap">bootstrap</h3>
<p>app.php 파일을 갖고 있는 디렉토리</p>
<p>app.php는 라라벨 애플리케이션의 부트스트래핑을 담당</p>
<h3 id="config">config</h3>
<p>라라벨 애플리케이션의 설정 파일</p>
<h3 id="database">database</h3>
<p>데이터베이스마이그레이션, 시드 파일들을 작성하는 디렉토리</p>
<h3 id="public">public</h3>
<p>css,js를 작성하는 디렉토리</p>
<h3 id="resource">resource</h3>
<p>뷰 파일을 작성하는 디렉토리</p>
<h3 id="routes">routes</h3>
<p>루트 디렉토리</p>
<h3 id="vender">vender</h3>
<p>컴포저에 의존성을 가지고 있는 디렉토리<img src="https://velog.velcdn.com/images/geon_0/post/63f31b0f-4d58-40b4-8c16-88e9251239a6/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 페이지 속도 개선]]></title>
            <link>https://velog.io/@geon_0/%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%86%8D%EB%8F%84-%EA%B0%9C%EC%84%A0</link>
            <guid>https://velog.io/@geon_0/%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%86%8D%EB%8F%84-%EA%B0%9C%EC%84%A0</guid>
            <pubDate>Wed, 30 Aug 2023 11:03:06 GMT</pubDate>
            <description><![CDATA[<h2 id="비지니스-로직-변환">비지니스 로직 변환</h2>
<ul>
<li>오래된 시스템의 경우 필요없는 비지니스 로직이 존재한다.
해당 비지니스 로직을 단순화 하거나 줄여준다면 페이지 속도를 개선할 수 있다.</li>
</ul>
<h2 id="쿼리-개선">쿼리 개선</h2>
<ul>
<li><p>SELECT 할때는 필요한 컬럼만
당연한 이야기지만 많은 필드 값을 불러올 수록 느려진다.</p>
</li>
<li><p>LIKE 사용시 %을 String 앞에 배치하지 않는다.
Index를 활용할 수 있는 IN()과는 다르게 LIKE %...은 FULL SCAN을 진행한다.</p>
</li>
<li><p>인덱스 (Index) 사용하기
인덱스를 사용하면 FULL SCAN하지 않고 인덱싱 되어있는 파일을 스캔하여 속도가 빠름</p>
</li>
<li><p>조건을 걸때 별도의 연산을 걸지 않기
Where 조건절에는 연산함수를 걸지 않는다.</p>
</li>
<li><p>SELECT DISTINCT, UNION DISTINCT 같은 중복 제거 연산 사용하지 않기
중복값을 제거하는 연산은 시간이 많이 걸림</p>
</li>
<li><p>ORDER BY는 연산 중간에 사용하지 않기</p>
</li>
</ul>
<h2 id="리소스-크기-줄이기">리소스 크기 줄이기</h2>
<ul>
<li><p>화면에 표시되는 이미지 영역보다 큰 사이즈의 이미지는 리소스 낭비
이미지를 서버에 저장할 때 여러 사이즈의 이미지로 리사이징하여 저장함
화면 표시 크기에 맞는 사이즈의 이미지 리소스를 불러옴</p>
</li>
<li><p>사용하지 않는 css나 Javascript를 제거하기
개발을 진행하면서 해당 부분을 관리하지 않으면 추후에 제거하기 힘들어짐
각 페이지별로 css나 js를 적용하는것이 아니라 공통된 모듈형태로 적용시키기</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[MYSQL 성능 개선]]></title>
            <link>https://velog.io/@geon_0/MYSQL-%EC%84%B1%EB%8A%A5-%EA%B0%9C%EC%84%A0</link>
            <guid>https://velog.io/@geon_0/MYSQL-%EC%84%B1%EB%8A%A5-%EA%B0%9C%EC%84%A0</guid>
            <pubDate>Fri, 25 Aug 2023 09:05:43 GMT</pubDate>
            <description><![CDATA[<p><em>MySQL 쓰면서 하지 말아야 할 것 17가지</em>
권장사항이다. 이것을 이해하면 당신의 어플리케이션이 더 나은 성능을 발휘할 것이다.</p>
<p>다만 이것이 사람의 실력을 판단하는 척도로 사용되서는 안 될 것이다.</p>
<p>작게 생각하기</p>
<ul>
<li>조만간 규모가 커질거라면 MySQL ecosystem을 봐야된다.</li>
<li>그리고 캐싱 빡시게 안 하는 메이저 웹사이트는 없다.</li>
<li>develooper.com의 Hansen PT랑 Ilia 튜토리얼 볼 것</li>
<li>처음부터 확장 가능하게 아키텍처 잘 쪼개놔야된다.</li>
<li>복제랑 파티셔닝 어떻게 할지 미리 계획 세워놔라.</li>
<li>파일 기반 세션 좀 쓰지마 -_-</li>
<li>그렇다고 너무 쓸데없이 크게 생각하지도 말 것</li>
<li>특히 성능하고 확장성 구분 못 하면 난감함</li>
</ul>
<p>EXPLAIN 안 써보기</p>
<ul>
<li>SELECT 앞에 EXPLAIN 이라고 붙이기만 하면 되는 것을 (..)</li>
<li>실행 계획 확인</li>
<li>타입 컬럼에 index 써있는거랑 Extra 컬럼에 index 써있는거랑 “매우 큰” 차이 있음</li>
<li>타입에 있으면 Full 인덱스 스캔 (안 좋다.)</li>
<li>Extra 컬럼에 있으면 Covering 인덱스 찾았다는 의미임 (좋다!)</li>
<li>5.0 이후부터는 index_merge 최적화도 한다.</li>
</ul>
<p>잘못된 데이터 타입 선택</p>
<ul>
<li>한 메모리 블럭 단위에 인덱스 레코드가 많이 들어갈수록 쿼리가 빨리 실행될 것이다. (중요)</li>
<li>아.. 정규화 좀 해 -_-… (이거 정말 충격과 공포인 듯)</li>
<li>가장 작은 데이터 타입을 써.. (진짜 BIGINT가 필요하냐고..)</li>
<li>인덱스 걸리는 필드는 정말 최소한으로 데이터 크기를 써야된다고.</li>
<li>IP는 INT UNSIGNED로 저장해!! (아주 공감)</li>
<li>이럴 때 쓰라고 INET_ATON 함수가 아예 내장되어 있음.</li>
</ul>
<p>PHP에서 pconnect 쓰는 짓</p>
<ul>
<li>아파치에서 좀비 프로세스라도 생기면 그 커넥션은 그냥 증발하는거야..</li>
<li>어차피 MySQL 접속 속도는 Oracle이나 PostgreSQL 보다 10~100배 빠르다고.</li>
</ul>
<p>너무 과도한 DB 추상화 계층을 두는 것</p>
<ul>
<li>어디 포팅 열심히 할 거 아니면 추상화 계층 쓰지마 (ADODB, MDB2, PearDB 등)</li>
<li>scale out 가능한걸 쓰라고.</li>
</ul>
<p>스토리지 엔진 이해 못 하는 것</p>
<ul>
<li>단일 엔진만으로 전체 아키텍처를 결정했다면 대부분 최적이 아님</li>
<li>엔진 별 장단점을 공부할 것</li>
<li>ARCHIVE : zlib으로 압축해주고 UPDATE 안 되고 로그 Bulk Insert에 유용함.</li>
<li>MEMORY : 서버 재시작하면 증발. 인덱스가 HASH나 BTREE로 가능함. 임시, 요약 데이터에 사용.</li>
<li>주간 top X 테이블 같은 것.</li>
<li>하여튼 메모리에 박아넣고 싶은 데이터 있으면..</li>
</ul>
<p>인덱스 레이아웃 이해 못 하는 것</p>
<ul>
<li>제대로 인덱스랑 스토리지 엔진 선택하려면 공부 좀 해</li>
<li>엔진은 데이터와 인덱스 레코드를 메모리나 디스크에 레이아웃하는 걸 구현한 것</li>
<li>clustered 구성은 데이터를 PK 순서에 따라 저장함.</li>
<li>non-clustered 구성은 인덱스만 순서대로 저장하고 데이터는 순서 가정하지 않음.</li>
<li>clustered에서는 인덱스만 타면 추가적인 조회 없이 바로 데이터 가져오는 것임.</li>
<li>그래서 clustered PK는 작은 놈으로 할 필요가 있다는거</li>
<li>다른 인덱스는 각 레코드마다 PK를 앞에 더 붙이게 되니까.</li>
<li>PK 지정 안 하면 아무렇게나 해버림</li>
</ul>
<p>쿼리 캐시 이해 못 하는 것</p>
<ul>
<li>어플리케이션 read/write 비율은 알고 있어야지</li>
<li>쿼리 캐시 설계는 CPU 사용과 읽기 성능 간의 타협</li>
<li>쿼리 캐시 크기를 늘린다고 읽기 성능이 좋아지는게 아님. heavy read라도 마찬가지.</li>
<li>과도한 CPU 사용을 막기 위해 무효화 할 때는 캐시 항목들을 뭉텅이로 날려버림</li>
<li>한마디로 SELECT가 참조하는 테이블 데이터 하나라도 변경되면 그 테이블 캐시는 다 날라간다는 얘기임</li>
<li>수직 테이블 파티셔닝으로 처방</li>
<li>Product와 ProductCount를 쪼갠다든지..</li>
<li>자주 변하는 것과 변하지 않는 것을 쪼개는게 중요하다 이 말임.</li>
</ul>
<p>Stored Procedure를 쓰는 것</p>
<ul>
<li>무조건 쓰면 안 된다는게 아니고..</li>
<li>컴파일 할 때 무슨 일이 일어나는지 이해 못 하고 쓰면 재앙이 된다 이 말.</li>
<li>다른 RDBMS랑 다르게 connection thread에서 실행 계획이 세워짐.</li>
<li>이게 뭔 얘기냐 하면 데이터 한 번 가져오고 연결 끊으면 그냥 CPU 낭비 (7~8% 정도)하는 꼴이라는 것.</li>
<li>웬만하면 Prepared 구문과 Dynamic SQL을 써라.. 아래 경우를 제외하고</li>
<li>ETL 타입 프로시저</li>
<li>아주아주 복잡하지만 자주 실행되지는 않는 것</li>
<li>한 번 요청할 때마다 여러번 실행되는 간단한 것 (연결한 상태로 여러번 써야 된다니까)</li>
</ul>
<p>인덱스 컬럼에 함수 쓰는 것</p>
<ul>
<li>함수에 인덱스 컬럼 넣어 호출하면 당연히 인덱스 못 탄다</li>
<li>함수를 먼저 계산해서 상수로 만든 다음에 = 로 연결해야 인덱스 탈 수 있다.</li>
<li>여기 실행 계획 보면 LIKE도 range type 인덱스 타는 것 보임</li>
</ul>
<p>인덱스 빼먹거나 쓸모없는 인덱스 만들어 놓는 것</p>
<ul>
<li>인덱스 분포도(selectivity)가 허접하면 안 쓴다.</li>
<li>S = d/n</li>
<li>d = 서로 다른 값의 수 (# of distinct values)</li>
<li>n = 테이블의 전체 레코드 수</li>
<li>쓸모없는 인덱스는 INSERT/UPDATE/DELETE를 느리게 할 뿐..</li>
<li>FK는 무조건 인덱스 걸어라. (물론 FK 제약 걸면 인덱스 자동으로 생긴다.)</li>
<li>WHERE나 GROUP BY 표현식에서 쓰이는 컬럼은 인덱스 추가를 고려할 것</li>
<li>covering index 사용을 고려할 것</li>
<li>인덱스 컬럼 순서에 유의할 것!</li>
</ul>
<p>join 안 쓰는 짓</p>
<ul>
<li>서브쿼리는 join으로 재작성해라</li>
<li>커서 제거해라</li>
<li>좋은 Mysql 성능을 내려면 기본</li>
<li>집합 기반으로 생각해야지 루프 돌리는거 생각하면 안 된다.</li>
</ul>
<p>Deep Scan 고려하지 않는 것</p>
<ul>
<li>검색엔진 크러울러가 쓸고 지나갈 수 있다.</li>
<li>이 경우 계속해서 전체 집합을 정렬한 다음 LIMIT로 가져와야 하니 무진장 느려진다.</li>
<li>어떻게든 집합을 작게 줄인 다음 거기서 LIMIT 걸어 가져올 것</li>
</ul>
<p>InnoDB 테이블에서 WHERE 조건절 없이 SELECT COUNT(*) 하는 짓</p>
<ul>
<li>InnoDB 테이블에서는 조건절 없이 COUNT(*) 하는게 느리다.</li>
<li>각 레코드의 transaction isolation을 유지하는 MVCC 구현이 복잡해서 그렇다는..</li>
<li>트리거 걸어서 메모리 스토리지 엔진 쓰는 테이블에 통계를 별도로 유지하면 된다.</li>
</ul>
<p>프로파일링이나 벤치마킹 안 하는 것</p>
<ul>
<li>프로파일링 : 병목 찾아내기</li>
<li>벤치마킹 : 시간에 따른 성능 변화 추이 평가, 부하 견딜 수 있는지 테스트</li>
<li>프로파일링 할 때는 실제 데이터를 옮겨와서 할 것</li>
<li>어디가 병목이냐~ Memory? Disk I/O? CPU? Network I/O? OS?</li>
<li>느린 쿼리 로그로 남기기</li>
<li>log_slow_queries=/path/to/log</li>
<li>log_queries_not_using_indexes</li>
<li>벤치마킹 시에는 다 고정시키고 변수 하나만 바꿔가면서 해야 함. (쿼리 캐시는 끌 것.)</li>
<li>도구를 써라~~</li>
<li>EXPLAIN</li>
<li>SHOW PROFILE</li>
<li>MyTop/innotop</li>
<li>mysqlslap</li>
<li>MyBench</li>
<li>ApacheBench (ab)</li>
<li>super-smack</li>
<li>SysBench</li>
<li>JMeter/Ant</li>
<li>Slow Query Log</li>
</ul>
<p>AUTO_INCREMENT 안 쓰는 것</p>
<ul>
<li>PK를 AUTO_INCREMENT로 쓰는건 무진장 최적화 되어 있음</li>
<li>고속 병행 INSERT 가능</li>
<li>잠금 안 걸리고 읽으면서 계속 할 수 있다는!</li>
<li>새 레코드를 근처에 놓음으로써 디스크와 페이지 단편화를 줄임</li>
<li>메모리와 디스크에 핫 스팟을 생성하고 스와핑을 줄임</li>
</ul>
<p>ON DUPLICATE KEY UPDATE를 안 쓰는 것</p>
<ul>
<li>레코드가 있으면 업데이트하고 없으면 인서트하고 이런 코드 필요없다!! 다 날려버려라!!</li>
<li>서버에 불필요하게 왔다갔다 할 필요가 없어짐</li>
<li>5-6% 정도 빠름</li>
<li>데이터 입력이 많다면 더 커질 수 있음
하지 말아야 할 것 총정리
Thinking too small
Not using EXPLAIN
Choosing the wrong data types
Using persistent connections in PHP
Using a heavy DB abstraction layer
Not understanding storage engines
Not understanding index layouts
Not understanding how the query cache works
Using stored procedures improperly
Operating on an indexed column with a function
Having missing or useless indexes
Not being a join-fu master
Not accounting for deep scans
Doing SELECT COUNT(*) without WHERE on an InnoDB table
Not profiling or benchmarking
Not using AUTO_INCREMENT
Not using ON DUPLICATE KEY UPDATEK</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[PHP isset ? empty ? is_null ]]></title>
            <link>https://velog.io/@geon_0/PHP-isset-empty-isnull</link>
            <guid>https://velog.io/@geon_0/PHP-isset-empty-isnull</guid>
            <pubDate>Wed, 23 Aug 2023 05:26:28 GMT</pubDate>
            <description><![CDATA[<h4 id="isset--변수에-값이-존재하는지-null이-아닌지를-확인하는-함수">isset : 변수에 값이 존재하는지, NULL이 아닌지를 확인하는 함수</h4>
<ul>
<li>bool isset()</li>
</ul>
<h4 id="empty--변수에-값이-비어있는지-확인하는-함수">empty : 변수에 값이 비어있는지 확인하는 함수</h4>
<ul>
<li>bool empty()</li>
</ul>
<h4 id="is_null--변수가-null인지를-확인하는-함수">is_null : 변수가 NULL인지를 확인하는 함수</h4>
<ul>
<li>bool is_null()</li>
</ul>
<h4 id="unset--변수를-제거하는-함수">unset : 변수를 제거하는 함수</h4>
<ul>
<li>void unset()</li>
</ul>
<img src="https://velog.velcdn.com/images/geon_0/post/82576896-f4c9-409e-870a-51bbcebd063a/image.png">




]]></description>
        </item>
        <item>
            <title><![CDATA[React-Native Unity 임베딩 하기]]></title>
            <link>https://velog.io/@geon_0/React-Native-Unity-%EC%9E%84%EB%B2%A0%EB%94%A9-%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@geon_0/React-Native-Unity-%EC%9E%84%EB%B2%A0%EB%94%A9-%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 23 Mar 2023 04:52:24 GMT</pubDate>
            <description><![CDATA[<h3 id="react-native에-unity-project-임베딩-하기">react native에 unity project 임베딩 하기</h3>
<h3 id="혹시나-같은-환경에-있는-개발자에게-삽질의-시간을-조금이라도-줄여주고-싶은-마음에">혹시나 같은 환경에 있는 개발자에게 삽질의 시간을 조금이라도 줄여주고 싶은 마음에..</h3>
<p>해당 게시글은 M1 mac 기준으로 작성되었습니다.</p>
<h4 id="1-android">1. android</h4>
<p>사용 라이브러리 : react-native-unity-play</p>
<p>url : <a href="https://www.npmjs.com/package/react-native-unity-play/v/0.1.6">https://www.npmjs.com/package/react-native-unity-play/v/0.1.6</a></p>
<h4 id="2-ios">2. ios</h4>
<p>사용 라이브러리 : @azesmway/react-native-unity</p>
<p>url : <a href="https://github.com/azesmway/react-native-unity">https://github.com/azesmway/react-native-unity</a></p>
<p>RN version : 0.68.2</p>
<p>android는 에뮬레이터로 가능하지만 ios는 실제기기가 있어야만 동작합니다.</p>
<h2 id="android-적용-방법">android 적용 방법</h2>
<p>unity project export 설정</p>
<ol>
<li>Export Project -&gt; 체크 선택</li>
<li>Player Settings -&gt; Resolution and Presentation -&gt; Start in fullscreen mode -&gt; 체크 해제</li>
<li>Player Settings -&gt; Resolution and Presentation -&gt; Render outside safe area -&gt; 체크 해제</li>
<li>Scripting Backend -&gt; IL2CPP </li>
<li>Api Compatibility Level -&gt; .NET Standard 2.0</li>
<li>Target Architectures -&gt; ARM64만 체크</li>
</ol>
<p>해당 unity 프로젝트 빌드 파일은 rn root 폴더에 unity라는 이름으로 경로를 만들어준 후 복사붙여넣기 하면 됨</p>
<p>react native project 설정</p>
<pre><code>npm install react-native-unity-play --force</code></pre><ol>
<li><p>android/app/libs 디렉토리 만들기</p>
</li>
<li><p>라이브러리 설정 파일 옮기기 
<project_name>/unity/builds/android/unityLibrary/libs/*</p>
</li>
</ol>
<p>-&gt; android/app/libs</p>
<ol start="3">
<li>android/app/build.gralde에 ndk 코드 넣기<pre><code>defaultConfig {
 ...
 ndk {
     abiFilters &quot;armeabi-v7a&quot;, &quot;arm64-v8a&quot;
 }
}</code></pre></li>
</ol>
<p>4.android/settings/gradle에 코드 넣기</p>
<pre><code>include &#39;:unityLibrary&#39;
project(&#39;:unityLibrary&#39;).projectDir=new File(&#39;../unity/unityLibrary&#39;)</code></pre><p>두번째 줄은 본인의 경로에 맞춰서 집어넣으면 됩니다.</p>
<ol start="5">
<li>android/app/build.gradle dependencies 부분에 코드 넣기</li>
</ol>
<pre><code>implementation project(&#39;:unityLibrary&#39;)
  implementation files(&quot;${project(&#39;:unityLibrary&#39;).projectDir}/libs/unity-classes.jar&quot;)</code></pre><ol start="6">
<li>android/app/src/main/res/values/string.xml 코드 추가</li>
</ol>
<pre><code>&lt;string name=&quot;game_view_content_description&quot;&gt;Game view&lt;/string&gt;
&lt;string name=&quot;unity_root&quot;&gt;unity_root&lt;/string&gt;</code></pre><ol start="7">
<li>AndroidManifest.xml의 MainActivity 업데이트하기</li>
</ol>
<pre><code>&lt;application
  ...
  android:extractNativeLibs=&quot;true&quot; 

&lt;activity
  android:name=&quot;.MainActivity&quot;
  ...
  android:configChanges=&quot;mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density&quot;
  android:hardwareAccelerated=&quot;true&quot;
&gt;</code></pre><ol start="8">
<li><project_name>/unity/builds/android/unityLibrary/src/main/AndroidManifest.xml안의 해당 코드 제거하기<pre><code>&lt;intent-filter&gt;...&lt;/intent-filter&gt;
</code></pre></li>
</ol>
<pre><code>

9. android/gradle.properties 코드 추가하기</code></pre><p>unityStreamingAssets=.unity3d</p>
<pre><code>
10.build.gralde에 코드추가하기
</code></pre><p>allprojects {
    repositories {
        flatDir {
            dirs &quot;$rootDir/app/libs&quot;
        }</p>
<pre><code>
11. 예시 코드
</code></pre><p>import { StyleSheet, View, Dimensions, Button, Platform, Text } from &quot;react-native&quot;;
import UnityView, {
  UnityModule,
  UnityResponderView,
} from &#39;react-native-unity-play&#39;;
import { useState } from &quot;react&quot;;</p>
<p>const {width, height} = Dimensions.get(&#39;window&#39;);</p>
<p>const App = () =&gt; {
  return (
    &lt;&gt;
    <View>
      <Text>RNPROJECT</Text>
      &lt;UnityView
        fullScreen={true}
        style={{width: width, height: height}}
      /&gt;
    </View>
    &lt;/&gt;
  );
};
export default App;</p>
<pre><code>


## 에러 해결 방법 

### 1. ndk 관련 해결 방법 

android/local.properties에 ndk 경로 지정

필자는 unityhub의 ndk 경로를 지정해주어서 해결함

### 2. libil2cpp 에러 해결 방법 

unity/unityLibrary/build.gradle BuildIl2Cpp 함수 부분 코드
</code></pre><p>def BuildIl2Cpp(String workingDir, String targetDirectory, String architecture, String abi, String configuration) {
    exec {
        commandLine(workingDir + &quot;/src/main/Il2CppOutputProject/IL2CPP/build/deploy/netcoreapp3.1/il2cpp&quot;,
            &quot;--compile-cpp&quot;,
            &quot;--avoid-dynamic-library-copy&quot;,
            &quot;--profiler-report&quot;,
            &quot;--libil2cpp-static&quot;,
            &quot;--platform=Android&quot;,
            &quot;--architecture=&quot; + architecture,
            &quot;--configuration=&quot; + configuration,
            &quot;--outputpath=&quot; + workingDir + targetDirectory + abi + &quot;/libil2cpp.so&quot;,
            &quot;--cachedirectory=&quot; + workingDir + &quot;/build/il2cpp_&quot;+ abi + &quot;_&quot; + configuration + &quot;/il2cpp_cache&quot;,
            &quot;--additional-include-directories=&quot; + workingDir + &quot;/src/main/Il2CppOutputProject/IL2CPP/external/bdwgc/include&quot;,
            &quot;--additional-include-directories=&quot; + workingDir + &quot;/src/main/Il2CppOutputProject/IL2CPP/libil2cpp/include&quot;,
            &quot;--tool-chain-path=&quot; + android.ndkDirectory,
            &quot;--map-file-parser=&quot; + workingDir + &quot;/src/main/Il2CppOutputProject/IL2CPP/MapFileParser/MapFileParser.exe&quot;,
            &quot;--generatedcppdir=&quot; + workingDir + &quot;/src/main/Il2CppOutputProject/Source/il2cppOutput&quot;,
            &quot;--baselib-directory=&quot; + workingDir + &quot;/src/main/jniStaticLibs/&quot; + abi,
            &quot;--dotnetprofile=unityaot&quot;)
        environment &quot;ANDROID_SDK_ROOT&quot;, getSdkDir()
    }
    delete workingDir + targetDirectory + abi + &quot;/libil2cpp.sym.so&quot;
    ant.move(file: workingDir + targetDirectory + abi + &quot;/libil2cpp.dbg.so&quot;, tofile: workingDir + &quot;/symbols/&quot; + abi + &quot;/libil2cpp.so&quot;)
}</p>
<pre><code>### 3. A problem occurred configuring project &#39;:react-native-unity-play&#39; 

    jcenter없어짐으로 인한 오류
    node_modules/react-native-unity-play/android/build.gradle에서 변경</code></pre><p> repositories {
        mavenCentral()
        //jcenter()
        maven { url &quot;<a href="https://maven.google.com&quot;">https://maven.google.com&quot;</a> }
    }</p>
<pre><code>


## ios 적용 방법

unity project export 설정

Player Settings -&gt; Strip Engine Code -&gt; 체크 해제

해당 unity 프로젝트 빌드 파일은 rn root 폴더에 unity/builds/ios 라는 이름으로 경로를 만들어준 후 복사붙여넣기 하면 됨

</code></pre><p>yarn add @azesmway/react-native-unity</p>
<pre><code>
cd ios 
pod install
이후에 xcode로 project 열기

![](https://velog.velcdn.com/images/geon_0/post/a0d49865-1d4b-49c0-b279-059394c3a1fc/image.png)

1. 프로젝트 루트에서 Add Files to &quot;your project&quot;

![](https://velog.velcdn.com/images/geon_0/post/fd421cb7-d216-4d93-a4cd-c5c9920e05cd/image.png)

2. unity/builds/ios/Unity-iPhone.xcodeproj 추가

![](https://velog.velcdn.com/images/geon_0/post/da34e458-b4cc-406e-9a4d-dcf93e27c4ad/image.png)

3. 이후 Unity-iPhone 프로젝트 Data 클릭 후 Target Membership -&gt; UnityFramework 체크

![](https://velog.velcdn.com/images/geon_0/post/cf23ec31-9b26-458f-9ce7-7a8f13be30ad/image.png)

4. Libraries/Plugins/iOS의 NativeCallProxy.h Target Membership -&gt; project에서 Public으로 변경 
만약 해당 경로가 없다면 새로 추가하여 해당 파일을 넣어줘야함

5. 프로젝트 루트클릭 후 General -&gt; Framework, Libraries, and Embedded Content에 UnityFramework.framework 추가 

![](https://velog.velcdn.com/images/geon_0/post/6758989d-76f2-4fef-aa51-c1ecb778882b/image.png)


6. Build Phases에 Link Binary With Libararies에서 UnityFramework.framework 삭제
7. Embed Frameworks 안의 파일들 Compile Sources로 drag&amp;drop으로 이동

![](https://velog.velcdn.com/images/geon_0/post/f38ff20a-8cb8-4110-a591-f43366794c94/image.png)


8. Project -&gt; scheme -&gt; Edit scheme 에 UnityFramework 추가 후 Build Order Manual Order로 변경

    UnityFramework가 먼저 빌드되어야 함

![](https://velog.velcdn.com/images/geon_0/post/08eaec43-9da0-4a4b-b91e-1c6f63659b24/image.png)

9. Run 설정에서 Debug executable 체크해제
    해당 부분 체크 해제하지않으면 빌드 완료되고 launchscreen에서 멈춰있음

![](https://velog.velcdn.com/images/geon_0/post/daf8cb26-a0b5-457b-ab65-0f34fe8dbf64/image.png)

예제 코드
</code></pre><p>import { StyleSheet, View, Dimensions, Button, Platform, Text } from &quot;react-native&quot;;
import UnityView from &#39;@azesmway/react-native-unity&#39;;</p>
<p>const {width, height} = Dimensions.get(&#39;window&#39;);</p>
<p>const App = () =&gt; {
  return (
    &lt;&gt;
      <View>
        <Text>RNPROJECT</Text>
        &lt;UnityView
          style={{width: width, height: height}}
        /&gt;
      </View>
    &lt;/&gt;
  );
};
export default App;</p>
<pre><code>
## 에러 해결 방법 

### 1. cannot find nativeCallProxy

nativeCallProxy.h파일을 public으로 설정해야함

### 2. 빌드 이후에 unityFramework 라이브러리를 찾을 수 없다.

해당 부분에 추가되어있는지 체크

![](https://velog.velcdn.com/images/geon_0/post/3ee21fc2-a27d-4cdd-95ee-960d1c03d6bf/image.png)


[nativeCallProxy.h,nativeCallProxy.m 파일](https://github.com/azesmway/react-native-unity/tree/main/example/unity/source/Assets/Plugins/iOS)

참고 링크 : https://github.com/azesmway/react-native-unity
https://www.npmjs.com/package/react-native-unity-play/v/0.1.6</code></pre>]]></description>
        </item>
    </channel>
</rss>