[{"data":1,"prerenderedAt":898},["ShallowReactive",2],{"post-document:\u002Fbackend\u002Fspring\u002F2026\u002F08\u002F12\u002F개념확인\u002F":3},{"id":4,"title":5,"body":6,"categories":882,"date":885,"description":886,"extension":887,"image":888,"key_concepts":888,"last_modified_at":888,"legacyPath":889,"meta":890,"navigation":892,"part":888,"path":893,"published":892,"robots":888,"seo":894,"series":888,"stem":895,"strengths":888,"summary":888,"tags":896,"tradeoffs":888,"__hash__":897},"posts\u002Fposts\u002FBackend\u002FSPRING\u002F개념확인.md","2. Field\u002F Parameter \u002F Argument\u002F this",{"type":7,"value":8,"toc":860},"minimark",[9,31,35,41,44,50,53,56,62,65,68,75,78,84,87,90,95,98,101,104,107,110,113,116,119,122,125,128,137,141,144,147,158,161,164,167,264,267,270,274,277,280,283,288,291,294,297,300,303,310,315,319,322,325,330,336,339,342,346,351,354,357,360,363,366,369,372,375,379,383,386,389,392,394,397,400,405,408,411,414,417,422,426,433,437,440,443,450,457,460,464,467,470,473,480,491,495,498,508,513,516,519,522,528,531,534,537,540,544,547,551,555,558,562,565,568,571,574,577,580,583,586,589,593,598,603,606,609,612,615,618,621,625,628,631,634,637,640,643,646,649,652,656,659,662,676,679,682,688,694,697,700,703,706,710,713,724,727,730,734,737,741,744,747,751,754,757,771,775,778,781,795,799,802,806,809,812,815,818,821,824,828,831,834,837,841,844,847,852,855],[10,11,12,16,19,22,25,28],"ol",{},[13,14,15],"li",{},"User : 클래스, user: 참조 변수명, new : 새 객체 생성  User(\"민형\") : 생성자, \"민형\" : parameter 에 들아가는 arguement",[13,17,18],{},"a : 필드 , b : macbook, 2000000 , c: 생성자에 들어가는 arguement d: 필드의 값을 지정하는 parameter e: 클래스를 생성하고 생성한 클래스를 바탕으로 참조변수명을 선언하고, 선언한 클래스에 argumen를 넣어서 새로운 인스턴스를 생성한다.",[13,20,21],{},"a : User 객체는 2개 생성, b : 참조하는 객체가 같아서 true, c : false, 참조하는 객체가 다르다. d: 2. name의 경우에는 인스턴스마다 별개로 저장되지만, count는 공통 클래스의 경우에는 공통 필드 값을 사용한다. 따라서 user 클래스를 호출하면 공통 필드에 +1이 더해진다. f: 공통해서 써야하는 필드값이나 메서드, 클래스를 반복해서 사용해야 할 때 사용한다. g : 가능하다. 새롭게 선언하는 건 괜찮다. h: 불가능하다. 일단 처음 선언값이외에는 변경이 불가능하다.",[13,23,24],{},"Package와 Import\nA: package com.practice \u002F\u002F 본인의 경로를 적으면 된다.\nB: import com.practice.model.User\nC: ?? 그러길래 뭐냐?\nD: import는 실제 클래스 파일을 불러오는 것이 아니라 주어진 경로부터 클래스와 메서드를 불러오는 것\nE: package는 import 할 주소 지정, import는 실제로 클래스와 메서드를 불러오는 명령어",[13,26,27],{},"Interface, 추상화, 구현, 다형성\na : 인터페이스의 역할 필수로 구현해야 할 형식을 지정해주는 것이다.\nb : Dog가 makeSound()를 구현하지 않으면 컴파일 에러가 난다.\nc : abstract로 지정해서 구현하지 않아도 되게 만든다.\nd : 변수의 타입은 Dog, 실제 객체의 타입은 animal이다.\ne : Dog의 구현이 실행된다.\nf : 추상화는 implemetns, 다형성은 클래스 지정에서 나타난다.\ng : 부모 클래스인 Animal을 만들고, 그 하위 클래스인 Dog, cat을 만들고 부모 클래스를 상속 받는다. 각 클래스는 makesound()를 구현하고, 각각 a,b에 클래스를 부여하고 인스턴스를 생성한다.",[13,29,30],{},"Generic",[32,33,34],"p",{},"a. Generic -> ArrayList에는 string만 들어갈 수 있다.\nb. names.add(100) -> 컴파일 시점이다. 애초에 arraylist에 string을 지정해서, 100은 리스트에 넣을 수 없다.\nc. Generic을 사용하면 지정된 데이터 형식만 처리하므로, 추후에 데이터를 처리할 때 형변환 횟수가 줄어들 게 된다.\nd. int가 아닌 Integer 이다. 근데 이유는 모르겠다. 설명 좀\ne. int -> Integer\nf. 특정 타입만 사용하도록 고정하기 때문에 데이터 타입을 예측할 수 있으며, 재사용성은 복제 어쩌고 저쩌고 였는데. 추후에 데이터를 추출할 때 데이터 형변환을 진행할 필요가 줄어들기 때문에 저장 용량과 프로세스를 절약할 수 있다.",[10,36,38],{"start":37},7,[13,39,40],{},"ArrayList, Iterator, Stream API",[32,42,43],{},"a : 순서를 바꾸기 쉽다?\nb : 모르겠는데\nc : hasNext() 와 next() ㄹㅇ 뭐냐 걍 모르겠는데?\nd : 스트림 생성 -> + 포함한 레코드 필터링 -> 추출된 요소 라인별로 출력\ne : filter는 말 그대로 조건에 맞는 요소만 추출하는 명령어, map은 데이터를 조작하는 명령어\nf : 데이터흐름을 쉽게 볼수 있게 하는 API",[10,45,47],{"start":46},8,[13,48,49],{},"Reflection과 Annotation",[32,51,52],{},"a : 클래스, 필드, 메서드\nb : 실행중에도 메서드를 호출할 수 있다.\nc : 작동시간이 지연될 수 있으며, 데이터가 꼬일 수 있다.(무슨 말이 있었는데 잘 모르겠음)\nd : Annotation이란 컴파일러에게 참조를 보내는 사인이야\ne : 실행하지는 않는데 컴파일러에게 상속받은 부분을 다시 쓴다고 알려줘\nf : annotation으로 서술해놓으면 reflection이 참조해서 들여다볼 수 있아",[32,54,55],{},"근데 annotation은 컴파일 과정이 어캐 되는거임? 아무위치에나 쓰지는 않을 거 아냐",[10,57,59],{"start":58},9,[13,60,61],{},"JVM 실행 구조",[32,63,64],{},"다음 단어를 전부 사용해서 Java 프로그램이 실행되는 과정을 설명해라",[32,66,67],{},".java\njavac\n.class\nBytecode\nClassLoader\nJVM\nStack\nHeap\nInterpreter\nJIT Compiler\nGarbage Collector",[32,69,70,71,74],{},"public static void main(String",[72,73],"span",{}," args) {\nUser user = new User(\"민형\");\n}",[32,76,77],{},"a. 참조변수는 stack에 저장된다.\nb. 메서드 호출마다 생성되는 실행단위는 ..???\nc. new User() 객체를 아무도 참조하지 않으면 Garbage Collector 가 메모리를 회수한다.\nd. 컴파일러로 바이트코드를 미리 만들어놓고, 인터프리터로 해석한다..? 잘 모르겠는데",[10,79,81],{"start":80},10,[13,82,83],{},"Spring 종합 문제",[32,85,86],{},"a. @repository DB API, @service 처리 API, @RestController ??\nb. Spring이 관리하는 객체는 bean\nc. Spring API\nd. IcU\ne. 읽고, 처리하고, DB로 보내\nf. ?\ng. 메타데이터를 해석해서 동작해\nh. SPring을 자바를 이용해서 API를 관리하는 도구, Spring Anootation은 지정한 annotation을 읽고 작동하는 것",[32,88,89],{},"--- 평가 점수",[10,91,92],{},[13,93,94],{},"Class \u002F Object \u002F Reference \u002F Constructor",[32,96,97],{},"문제 : User user = new User(\"민형\");",[32,99,100],{},"내 답",[32,102,103],{},"User: 클래스\nuser: 참조 변수명\nnew: 새 객체 생성\nUser(\"민형\"): 생성자\n\"민형\": parameter에 들어가는 argument",[32,105,106],{},"답",[32,108,109],{},"User\n→ 클래스 타입",[32,111,112],{},"user\n→ 참조 변수",[32,114,115],{},"new\n→ 새로운 객체를 생성하는 키워드 (키워드라는 것을 잊지 말자)",[32,117,118],{},"User(\"민형\")\n→ 생성자 호출",[32,120,121],{},"\"민형\"\n→ 생성자에 전달되는 argument",[32,123,124],{},"User 클래스를 기반으로 새로운 객체를 생성하고, \"민형\"을 생성자의 argument로 전달한 뒤, 생성된 객체의 참조를 user 변수에 저장한다.",[32,126,127],{},"고쳐야 할 점 :",[129,130,131,134],"ul",{},[13,132,133],{},"class -> 이미 존재하는 설계도",[13,135,136],{},"new -> 그 설계도로 객체 생성",[138,139,5],"h1",{"id":140},"_2-field-parameter-argument-this",[32,142,143],{},"문제",[32,145,146],{},"class Product {",[148,149,154],"pre",{"className":150,"code":152,"language":153},[151],"language-text","String name;\nint price;\n\nProduct(String name, int price) {\n    this.name = name;\n    this.price = price;\n}\n","text",[155,156,152],"code",{"__ignoreMap":157},"",[32,159,160],{},"}",[32,162,163],{},"Product p = new Product(\"MacBook\", 2000000);",[32,165,166],{},"정확한 구분",[168,169,170,183],"table",{},[171,172,173],"thead",{},[174,175,176,180],"tr",{},[177,178,179],"th",{},"코드",[177,181,182],{},"정확한 용어",[184,185,186,197,206,216,225,235,244,254],"tbody",{},[174,187,188,194],{},[189,190,191],"td",{},[155,192,193],{},"String name;",[189,195,196],{},"Field",[174,198,199,204],{},[189,200,201],{},[155,202,203],{},"int price;",[189,205,196],{},[174,207,208,213],{},[189,209,210],{},[155,211,212],{},"String name",[189,214,215],{},"Parameter",[174,217,218,223],{},[189,219,220],{},[155,221,222],{},"int price",[189,224,215],{},[174,226,227,232],{},[189,228,229],{},[155,230,231],{},"\"MacBook\"",[189,233,234],{},"Argument",[174,236,237,242],{},[189,238,239],{},[155,240,241],{},"2000000",[189,243,234],{},[174,245,246,251],{},[189,247,248],{},[155,249,250],{},"this.name",[189,252,253],{},"현재 객체의 Field",[174,255,256,261],{},[189,257,258],{},[155,259,260],{},"name",[189,262,263],{},"생성자의 Parameter",[32,265,266],{},"this는 생성자로 전달받은 name parameter의 값을 현재 객체의 name field에 저장한다.",[32,268,269],{},"Product 클래스를 기반으로 새로운 객체를 생성하면서 \"MacBook\"과 2000000 을 생성자의 argument로 전달하고, 생성자는 해당값을 객체의 name, price field에 저장한다.",[138,271,273],{"id":272},"_3-static-final-참조","3. Static \u002F final \u002F 참조",[32,275,276],{},"final 에서 정확히 반대로 이해했다.",[32,278,279],{},"User a = new User(\"민형\");\nUser b = a;\nUser c = new User(\"철수\");",[32,281,282],{},"a == b : true : 같은 객체 참조\na == c : false : 다른 객체 참조",[284,285,287],"h3",{"id":286},"static","Static",[32,289,290],{},"내 답 : 공통해서 써야하는 필드값이나 메서드, 클래스를 반복해서 사용해야 할 때\n정확한 답 : static은 특정 인스턴스가 아니라 클래스 자체에 소속되는 멤버를 선언하며, 모든 인스턴스가 하나의 값을 공유할 수 있도록 한다.",[32,292,293],{},"instance field -> 객체마다 존재\nstatic field -> 클래스에 하나 존재",[284,295,296],{"id":296},"final",[32,298,299],{},"static final User user = new User(\"민형\");",[32,301,302],{},"-> final 참조 변수를 다른 객체로 재할당이 불가능하다\n-> user.name = \"철수\"; 는 가능. 참조 변수를 다른 객체로 재할당이 안되는 것이지, 객체 내부 값 변경 자체를 막는 것이 아니다.",[32,304,305,306,309],{},"final user ───→ ",[72,307,308],{},"User 객체","\nname = 민형\n↓\n철수",[129,311,312],{},[13,313,314],{},"요약 : static은 소속과 공유의 문제, final은 재할당의 문제이다.",[138,316,318],{"id":317},"_4-package-import","4. Package \u002F import",[32,320,321],{},"내 답 : package는 import 할 주소 지정, import는 실제로 클래스와 메서드를 불러오는 명령어",[32,323,324],{},"package",[129,326,327],{},[13,328,329],{},"package com.practice.model;",[331,332,333],"blockquote",{},[32,334,335],{},"현재 클래스가 com.practice.model 이라는 이름 공간에 속한다고 선언한다. (진짜 포장해주는 것)",[32,337,338],{},"package\n→ 현재 클래스의 소속",[32,340,341],{},"내가 적은 답인 단순한 물리적 폴더 주소도 아니고, 라이브러리를 만드는 기능도 아니다.",[343,344,345],"h2",{"id":345},"import",[129,347,348],{},[13,349,350],{},"import com.prcatice.model.User;",[32,352,353],{},"뜻 : com.practice.model.User 라는 클래스 이름을 현재 소스 코드에서 User라고 간단하게 사용할 수 있다.",[32,355,356],{},"-> 실제로 파일을 가져오거나 메모리에 로딩하는 기술이 아니다.",[32,358,359],{},"사실 임포트 없이도 쓸 수는 있다",[32,361,362],{},"com.practice.model.User user =\nnew com.practice.model.User();",[32,364,365],{},"그런데 귀찮잔슴?",[32,367,368],{},"import com.practice.model.User; 때리고",[32,370,371],{},"User user = new User(); 라고 쓰는 것",[32,373,374],{},"요약 : package는 현재 클래스의 소속 namespace를 정의하고, import는 다른 package의 타입을 현재 소스에서 간단한 이름으로 사용할 수 있게 된다.",[138,376,378],{"id":377},"_5-interface-추상화-다형성","5. Interface \u002F 추상화 \u002F 다형성",[343,380,382],{"id":381},"interface","Interface",[32,384,385],{},"내 답 : 인터페이스는 필수로 구현해야 할 형식을 지정\n더 정확하게는 : 인터페이스는 구현 클래스가 제공해야 하는 공퉁 기능의 계약을 정의한다.",[32,387,388],{},"Animal a = new Dog();",[32,390,391],{},"참조 변수 타입 -> Animal\n실제 객체 타입 -> Dog",[32,393,388],{},[343,395,396],{"id":396},"추상화",[32,398,399],{},"implements 자체가 추상화는 아니다. 추상화를 가능하게 하는 명령어일뿐",[331,401,402],{},[32,403,404],{},"모든 Animal은 makeSound() 라는 기능이 있어야 한다.",[32,406,407],{},"라는 공통 규칙만 정의하고 실제 구현 방법을 숨긴 것이 추상화",[343,409,410],{"id":410},"다형성",[32,412,413],{},"Animal a = new Dog();\nAnimal b = new Cat();",[32,415,416],{},"같은 Animal 타입으로 서로 다른 구현체를 구현하는 것 (Dog,Cat)",[331,418,419],{},[32,420,421],{},"Animal 인터페이스가 공통 기능을 추상화하고, Dog 와 Cat이 이를 각각 구현하며, 두 구현체를 Animal 타입으로 동일하게 처리함으로써 다형성을 활용한다.",[138,423,425],{"id":424},"_6-generic","6. Generic",[32,427,428,429],{},"ArrayList",[430,431,432],"string",{}," -> String만 저장하도록 타입을 지정\nnames.add(100); -> 컴파일 에러\nGeneric 덕분에 반환 타입을 알고 있어서 형변환이 줄어든다는 것도 맞다.",[343,434,436],{"id":435},"그런데-int은-안-되고-integer인가","그런데 int은 안 되고 Integer인가?",[32,438,439],{},"Generic은 기본적으로 참조 타입(reference type)을 사용한다.",[32,441,442],{},"int, double, boolean, char -> 이것들은 객체가 아니라 Primitive type",[32,444,445,446],{},"그래서 ArrayList",[447,448,449],"int",{}," -> X, primitive 타입은 받지 않는다.",[32,451,452,453],{},"그 대신에 Wrapper Class인 ArrayList",[454,455,456],"integer",{}," 를 사용한다.",[32,458,459],{},"int -> Integer\ndouble -> Double\nboolean -> Boolean\nchar -> Character",[284,461,463],{"id":462},"generic의-목적","Generic의 목적",[32,465,466],{},"내 답 : 저장 용량과 프로세스를 절약한다",[32,468,469],{},"핵심 : Generic은 사용할 타입을 컴파일 시점에 명확하게 지정하여, 타입 안정성을 확보하고, 불필요한 형변환을 줄이고, 하나의 클래스나 메서드를 여러 타입에 재사용할 수 있게 한다.",[32,471,472],{},"특히 재사용성은",[32,474,475,476],{},"class Box",[477,478,479],"t",{}," {\nT value;\n}",[32,481,482,483],{},"-> Box",[430,484,485,486],{},", Box",[454,487,485,488],{},[489,490],"user",{},[138,492,494],{"id":493},"_7-arraylist-iterator-stream","7, ArrayList \u002F Iterator\u002F Stream",[343,496,428],{"id":497},"arraylist",[32,499,500,501,503,504,507],{},"일단 배열의 사용방법부터 알아보자 : String",[72,502],{}," history = new String",[72,505,506],{},"100",";\n-> 크기를 미리 정한다.",[32,509,428,510],{},[430,511,512],{}," history = new ArrayList\u003C>();\n-> 데이터가 추가되면셔 크기를 동적으로 관리한다.",[32,514,515],{},"그래서 h\nhistory.add(...)\nhistory.remove(...)",[32,517,518],{},"같은 Collection 기능을 편하게 쓸 수 있다.",[343,520,521],{"id":521},"iterator",[32,523,524,525],{},"Iterator",[430,526,527],{}," iterator = history.iterator();",[32,529,530],{},"while (iterator.hasNext()) {\nSystem.out.println(iterator.next());\n}",[32,532,533],{},"hasNext(): 다음요소가 존재하는지 확인\nnext() : 다음 요소를 반환하고 iterator를 다음 위치로 이동",[32,535,536],{},"현재 위치\n->\nhasNext()\n->\n다음 데이터 있나?",[32,538,539],{},"있음\n->\nnext()\n->\n데이터 가져오기 + 위치 이동",[284,541,543],{"id":542},"stream","Stream",[32,545,546],{},"요약 : Stream API는 Collection 데이터를 filter, map등의 연산으로 선언적인 파이프라인 형태로 가공할 수 있도록 하는 제공하는 API이다.",[138,548,550],{"id":549},"_8-reflection-annotation","8. Reflection \u002F Annotation",[284,552,554],{"id":553},"reflection으로-알-수-있는-것","Reflection으로 알 수 있는 것",[32,556,557],{},"클래스 이름과 타입 정보\n필드\n메서드\n생성자\nAnnotation\n접근 제어자\n상속 및 인터페이스 정보",[284,559,561],{"id":560},"일반-메서드-호출과의-차이","일반 메서드 호출과의 차이",[32,563,564],{},"내 답 : 실행 중에도 메서드를 호출할 수 있다.",[32,566,567],{},"Reflection의 특징 : 컴파일 시 코드에 직접 지정하지 않고도, 런타임에 클래스 구저를 조사해서 메서나 필드를 동적으로 찾아 접근할 수 있다는 것",[32,569,570],{},"일반적으로",[32,572,573],{},"user.hello(); 코드 작성 시점에 hello()를 알고 있다.",[32,575,576],{},"Reflection:",[32,578,579],{},"Method method = User.class.getDeclaredMethod(\"hello\")\nmethod.invoke(user);",[32,581,582],{},"실행하면서 \"hello\" 라는 이름을 찾아 실행할 수 있다.",[32,584,585],{},"남용하면 안되는 이유",[32,587,588],{},"캡슐화 우회 가능\n컴파일 타임 타입 검사 약화\n런타임 오류 가능성 증가\n코드 추적 어려움\n성능 비용",[138,590,592],{"id":591},"번외-annotation에-대한-내-질문","번외 : Annotation에 대한 내 질문",[331,594,595],{},[32,596,597],{},"Annotation은 컴파일 과정이 어떻게 되는 것?",[129,599,600],{},[13,601,602],{},"코드에 붙이는 메타데이터",[32,604,605],{},"@Override\npublic void run(){\n}",[32,607,608],{},"@Override는 메서드에 붙인다",[32,610,611],{},"반면 :",[32,613,614],{},"@Service\npublic class UserService{}",[32,616,617],{},"@Service는 클래스에 붙인다.\n이걸 제한하는 게 @Target",[32,619,620],{},"@Target(ElementType.METHOD) -> 이러면 메서드에만 사용가능\n@Target(ElementType.TYPE) -> 클래스나 인터페이스 같은 타입 선언에 사용 가능",[138,622,624],{"id":623},"annotation의-생명주기","Annotation의 생명주기",[32,626,627],{},"@Retention 이라는 게 있다.",[32,629,630],{},"SOURCE\n-> 소스 코드에서만 존재\n-> 컴파일 후 사라질 수 있다",[32,632,633],{},"CLASS\n-> .class까지 저장\n-> 런타임 Reflection에 반드시 노출되는 것은 아니다.",[32,635,636],{},"RUNTIME\n-> .class에 저장\n-> JVM 실행 중 Reflection 으로 조회 가능",[32,638,639],{},"@Override는 컴파일러가 주로 확인하는 Annotation",[32,641,642],{},"반면 Spring의:",[32,644,645],{},"@Service\n@RestController",[32,647,648],{},"같은 Annotation은 런타임에서 Spring이 확인할 수 있어야 하므로 런타임 메타데이터로 남는다.",[32,650,651],{},".java\n->\njavac\n->\nAnnotation 문법 검사\n->\n@target 검사\n->\n필요한 compile-time 처리\n->\n.class\n->\nRetention 정책에 따라 Annotation 정보 보존\n->\nJVM 실행\n->\nRUNTIME Annotation이면\nReflection \u002F Spring Framework등이 조회 가능",[138,653,655],{"id":654},"_9-jvm","9. JVM",[32,657,658],{},"전체 실행 구조",[32,660,661],{},"Main.java\n->\njavac\n->\nMain.class\n->\nJava Bytecode\n->\nClassLoader\n->\nJVM에 클래스 로딩\n->\nRuntime Memory",[129,663,664,667,670,673],{},[13,665,666],{},"Heap",[13,668,669],{},"Stack\n->\nExecution Engine",[13,671,672],{},"Interperter",[13,674,675],{},"JIT Compiler\n->\n실행",[32,677,678],{},"실행 도중에 Garbage Collector\n->\nHeap의 사용되지 않는 객체 매모리 회수",[32,680,681],{},"Stack \u002F Heap\nUser user = new User(\"민형\");\n단순화하면:\nStack                  Heap",[32,683,684,685,687],{},"user ───────────────→ ",[72,686,308],{},"\nname=\"민형\"",[148,689,692],{"className":690,"code":691,"language":153},[151],"                    메서드 호출마다 만들어지는 것\n",[155,693,691],{"__ignoreMap":157},[32,695,696],{},"정답:\nStack Frame",[32,698,699],{},"예를 들어:\nmain()\n실행:\nStack",[32,701,702],{},"┌─────────────────┐\n│ main Stack Frame│\n│ user            │\n└─────────────────┘\n그 안에서:\ncalculate()\n호출:\nStack",[32,704,705],{},"┌─────────────────────┐\n│ calculate Frame     │\n├─────────────────────┤\n│ main Frame          │\n└─────────────────────┘",[138,707,709],{"id":708},"interpreter와-jit","Interpreter와 JIT",[32,711,712],{},"Interperter: Bytecode를 바로 해석하며 실행",[129,714,715,718,721],{},[13,716,717],{},"장점 : 시작이 빠르다",[13,719,720],{},"단점 : 반복 실행하면 계속 해석해야 해서 비료\nJIT",[13,722,723],{},"자주 실행되는 Bytecode를 Native Machine Code로 컴파일",[32,725,726],{},"즉 :",[32,728,729],{},"JVM은 빠른 초기 실행을 위해 Interperter를 사용하고, 반복적으로 실행되는 hot code는 JIT Compiler가 네이티브 코드로 컴파일해 성능을 높인다.",[138,731,733],{"id":732},"_10-spring","10. Spring",[32,735,736],{},"HTTP Request\n->\nController\n->\nService\n->\nRepsoitory\n->\nDatabase",[343,738,740],{"id":739},"restcontroller","@RestController",[32,742,743],{},"@RestController\nclass UserController{}",[32,745,746],{},"HTTP 요청을 받는 REST Controller 역할",[343,748,750],{"id":749},"service","@Service",[32,752,753],{},"@Service\nclass UserService{}",[32,755,756],{},"비즈니스 로직 처리",[129,758,759,762,765,768],{},[13,760,761],{},"회원가입 가능 여부",[13,763,764],{},"가격 계산",[13,766,767],{},"주문 검증",[13,769,770],{},"결제 처리",[343,772,774],{"id":773},"repository","@Repository",[32,776,777],{},"@Repository\nclass UserRepository{}",[32,779,780],{},"데이터 저장소 접근 계층",[129,782,783,786,789,792],{},[13,784,785],{},"DB 조회",[13,787,788],{},"DB 저장",[13,790,791],{},"DB 수정",[13,793,794],{},"DB 삭제",[138,796,798],{"id":797},"bean","Bean",[32,800,801],{},"Spring Container가 생성하고 관리하는 객체를 Bean이라고 한다.",[138,803,805],{"id":804},"ioc","IoC",[32,807,808],{},"Inversion of Control",[32,810,811],{},"객체 생성과 관리의 제어권을 개발자 대신 Spring container가 가지는 것",[32,813,814],{},"일반 Java",[32,816,817],{},"개발자 -> new 객체",[32,819,820],{},"Spring",[32,822,823],{},"Spring Container -> 객체 생성 및 관리",[138,825,827],{"id":826},"di","DI",[32,829,830],{},"DI : Dependency Injection",[32,832,833],{},"public  UserController(UserService userService) {\nthis.userService = userService;\n}",[32,835,836],{},"spring이 필요한 UserService Bean을 넣어주는 것",[138,838,840],{"id":839},"요청-흐름","요청 흐름",[32,842,843],{},"GET \u002Fusers\u002F10",[32,845,846],{},"-> @GetMapping(\"\u002Fusers\u002F{id}\") : 컨트롤러가 받음\n-> @PathVariable Long id : 10을 id로 받음.\n-> userService.getUserName(10L) : Service 호출.\n-> userRepository.findName(10L) : Repository 호출.\nDB 또는 데이터 저장소 조회.\n-> Repository\n-> Service\n-> Controller\n-> HTTP Response",[129,848,849],{},[13,850,851],{},"Spring은 Java 객체의 생성과 생명주기, 의존 관계를 관리하고 웹, 데이터 접근, 트랜젝션등의 애플리케이션 기능을 제공하는 프레임워크이다.",[32,853,854],{},"Spring Annotation 한 문장",[129,856,857],{},[13,858,859],{},"Spring Annotation은 클래스나 메서드에 역할과 설정에 대한 메타데이터를 부여하고, Spring이 이를 해석하여 Bean 등록, HTTP 요청 매핑, DI 등의 기능을 적용할 수 있도록 한다.",{"title":157,"searchDepth":861,"depth":861,"links":862},2,[863,865,866,867,868,869,870,873,874,879,880,881],{"id":286,"depth":864,"text":287},3,{"id":296,"depth":864,"text":296},{"id":345,"depth":861,"text":345},{"id":381,"depth":861,"text":382},{"id":396,"depth":861,"text":396},{"id":410,"depth":861,"text":410},{"id":435,"depth":861,"text":436,"children":871},[872],{"id":462,"depth":864,"text":463},{"id":497,"depth":861,"text":428},{"id":521,"depth":861,"text":521,"children":875},[876,877,878],{"id":542,"depth":864,"text":543},{"id":553,"depth":864,"text":554},{"id":560,"depth":864,"text":561},{"id":739,"depth":861,"text":740},{"id":749,"depth":861,"text":750},{"id":773,"depth":861,"text":774},[883,884],"Backend","SPRING","2026-08-12 07:20:07 +0900","A: package com.practice \u002F\u002F 본인의 경로를 적으면 된다. B: import com.practice.model.User C: ?? 그러길래 뭐냐? D: import는 실제 클래스 파일을 불러오는 것이 아니라 주어진 경로부터 클래스와 메서드를 불러오는 것 E: package는 import 할 주소 지정, import는 실제로 클래스와 메서드를 불러오는 명령어","md",null,"\u002Fbackend\u002Fspring\u002F2026\u002F08\u002F12\u002F개념확인\u002F",{"layout":891},"post",true,"\u002Fposts\u002Fbackend\u002Fspring",{"title":5,"description":886},"posts\u002FBackend\u002FSPRING\u002F개념확인",[],"Pe4jClxOvz8ohPzRk-0lfC4BmOqmqSLzHA2268Fuw4g",1788744786015]