inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

ApplicationContext 통한 객체 추출의 단점

미해결

스프링 핵심 원리 - 기본편

안녕하세요! 강의 잘 수강하고 있습니다. ApplicationContext 통해서 객체 추출하면 컴파일 타임에서 오류를 찾기 어려운 단점이 있는 것 같아서, 정말 단점이 맞는지 확인하고 싶어서 질문드립니다. Spring을 적용하기 전 AppConfig를 직접 사용하던 경우에는 method 호출로 객체를 생성하기 때문에 method 이름이 변경된다면 컴파일 에러로 발견할 수 있습니다. 그런데 AnnotationConfigApplicationContext을 사용하고 나서는 등록된 Bean을 이름으로 검색해서 찾아오기 때문에 런타임 에러가 발생할 가능성이 생깁니다. 만약 제가 AppConfig 내의 method 이름을 변경하면 아래 코드는 에러를 만들게 됩니다. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = applicationContext.getBean("memberService", MemberService.class); @Configuration public class AppConfig { @Bean public MemberService emberService() { // 오타 발생 return new MemberServiceImpl(memberRepository()); } } 이렇게 되면 정적 타입 언어의 장점을 상쇄시키는게 아닌지 의문이 들었습니다. 그리고 서버 운영중에 Bean을 찾지 못해서 장애가 발생하는 경우는 없는지도 궁금합니다! 제가 뭔가 이해를 잘못했거나 내용을 놓쳤을 수도 있을 것 같습니다. 답변 기다리겠습니다 🙏

  • applicationcontext
  • spring
  • oop
  • di_container
홍성호 댓글 1 좋아요 1 조회수 646

intelliJ jdk11 oauth로그인 에러 문제입니다.

미해결

스프링부트 시큐리티 & JWT 강의

안녕하세요 훌륭한 강의를 잘 듣고있는 학생입니다. 다름이 아니라 제가 oauth로그인을 하면 오류가 발생하여 문의드립니다. 우선 저는 jdk11과 Gradle을 사용하고있습니다. 위와 같이 잘 작동하다가 아래와 같이 oauth로그인을 사용하면 에러가 발생합니다. Parameter 0 of method setFilterChains in org.springframework.security .config.annotation.web.configuration.WebSecurityConfiguration required a bean of type ' org.springframework.security .oauth2.client.registration.ClientRegistrationRepository' that could not be found. 에러의 총 내용은 위와 같습니다. 그래서 다른 질문들의 답변을 보니 라이브러리의 충돌 및 다운로드의 문제인거 같아 intelliJ에서 제공하는 invalidate cache기능을 사용하여 다시 재빌드를 하였지만 같은 에러가 발생하고 .\gradlew --refresh-dependencies를 사용하여 재빌드 또한 진행하였지만 같은 결과가 나왔습니다. 마지막으로 toolbox 및 인텔리제이를 다시 실행해도 같은 현상이 발생합니다. 혹시 방법을 알 수 있을까요??

  • jwt
  • spring
  • Spring Security
lcm2822 댓글 2 좋아요 1 조회수 3843

페이지의 장바구니 담기 기능 관련 오류

미해결

Nuxt.js 시작하기

<template> <div> <div class="container"> <div class="main-panel"> <img class="product-image" :src="product.imageUrl" :alt="product.name" /> </div> <div class="side-panel"> <p class="name">{{ product.name }}</p> <p class="price">{{ product.price }}</p> <button type="button" @click="addToCart">Add to Cart</button> </div> </div> </div> </template> <script> import {fetchProductById} from '@/api/index' export default { async asyncData({ params }) { const response = await fetchProductById(params.id); const product = response.data return{ product } }, methods: { addToCart() { this.$store.commit('addCartItem',this.product); this.$router.push('/cart') console.log("hi success") } } } </script> <style scoped> .container { display: flex; justify-content: center; margin: 2rem 0; } .product-image { width: 500px; height: 375px; } .side-panel { display: flex; flex-direction: column; justify-content: center; width: 220px; text-align: center; padding: 0 1rem; } </style> export const state= () => ({ cartItems: [''], }) export const mutations = { addCartItem(state, cartItem) { state.cartItems.push(cartItem) }, } 코드를 다음과 같이 작성했는데 강의처럼 addCartItem이 안나옵니다.

  • vuejs
  • nuxtjs
  • ssr
kyle3444 댓글 1 좋아요 1 조회수 401

강의 자료 요청드립니다!

미해결

프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)

강의 자료 다운이 안돼서 hanwool0614@naver.com으로 보내주시면 감사하겠습니다!😁

  • python
김한울 댓글 1 좋아요 0 조회수 205

"크롬이 자동화된 프로그램에 의해 제어되고 있다며" 실행을 중단시킵니다. 실행 중단을 혹시 막을수는 없을까요?

미해결

웹 자동화 프로그램 만들기(파이썬 + 셀레니움)

from selenium import webdriver driver = webdriver.Chrome("./chromedriver") 이렇게 치면 화면이 잠깐 떳다가 바로 중단되서 사라지는데 실행 중단을 막을수 없을까요?

  • selenium
  • python
안현정 댓글 2 좋아요 1 조회수 2223

웹스톰 ES lint " 양 따옴표로 자동 만들어지면서 빨간줄 오류 해결 법 문의

미해결

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

웹스톰 ES lint " 양 따옴표로 자동 만들어지는 오류 문제 해결 법 문의드려요 / import 부분이 자동으로 만들어지면서 "" 양따옴표로 만들어지면서 빨간줄 오류가 뜨는데, 이거 양따옴표 말고 홀따옴표로 설정 바꿀 수 있는 방법 있을까요? @Injectable() 만들었더니 자동으로 임포트 되면서 from 이후에 양따옴표로 만들어지네요 구글링 하거나 웹스톰에서 설정 찾아봐도 어떻게 바꿔야 될지 몰라서 문의드려봅니다.

  • express
  • nodejs
  • TypeORM
  • NestJS
김형 댓글 1 좋아요 1 조회수 428

의존성 관리 응용 부분에서 질문 있습니다

미해결

스프링 부트 개념과 활용

강의 내용처럼 dependency를 추가하려고 spring-boot-starter-data-jpa를 입력했는데 빨간 글씨로 나타나네요 마우스 커서를 올려보니 종속성 'org.springframework.boot:spring-boot-starter-data-jpa:2.7.7을(를) 찾을수 없습니다' 이렇게 뜹니다 구글링을 해봤지만 이 부분에 대한 해답을 찾기 어려워 질문 드립니다

  • spring
  • java
  • spring-boot
댓글 0 좋아요 0 조회수 354

프로젝트 설정을 다 하고

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

프로젝트 설정을 다 하고 시뮬레이터를 시작해보려하는데 아래와 같은 에러가 나네요 ㅠㅠㅠ + 구글링하다가 Podfile.lock 파일 삭제하고 돌려보라해서 했다가 Running pod install... 상태로 멈춰있네요... 살려주세요....

  • Flutter
  • 클론코딩
상우 댓글 1 좋아요 0 조회수 380

WebSecurityConfigurerAdapter를 사용 못하는 경우

미해결

스프링 시큐리티

자유주제가 맞을 것 같은데, 보통 질문 찾아보실 거 같아서 해당 카테고리에 올려둡니다. 작년 말, 스프링부트가 3.0 버전으로 올라오면서 WebSecurityConfigurerAdapter를 사용 못하게 된 것 같습니다. 방법 1. build.gradle의 스프링 부트 버전을 2.7 이하로 낮추니 deprecated 상태로 쓸 수 있었습니다. 방법 2. 부트 버전을 낮추지 않고 3.0에서 쓰려면 아래와 같이 SecurityFilterChain을 Bean으로 쓰면 될 것 같습니다. 참고: Spring Security without the WebSecurityConfigurerAdapter 잘못된 내용이 있으면 댓글로 알려주세요!

  • spring-boot
  • java
  • Spring Security
Chanuk 댓글 1 좋아요 15 조회수 4124

강의자료 요청 드립니다

미해결

프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)

안녕하세요 극초보입니다 강의자료 요청드립니다 chenjin11@naver.com으로 보내주시면 감사하겠습니다.

  • python
지니 댓글 1 좋아요 0 조회수 179

실행 질문

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

.========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 4분쯤에 실행했을 때 오류가 납니다. JAVA 11버전이라 dependency 에 추가도 했습니다. 영속성 강의 까지는 연동이 잘 되다가 안되네요 데이터 베이스 스키마 자동생성 강의에서는 코드를 추가로 입력 안했는데 필요한가요?

  • java
  • JPA
댓글 1 좋아요 0 조회수 269

실행 질문

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

.========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 4분쯤에 실행했을 때 오류가 납니다. JAVA 11버전이라 dependency 에 추가도 했습니다. 영속성 강의 까지는 연동이 잘 되다가 안되네요 데이터 베이스 스키마 자동생성 강의에서는 코드를 추가로 입력 안했는데 필요한가요?

  • JPA
  • java
MJkim 댓글 1 좋아요 0 조회수 344

참고자료

미해결

스프링부트 개념정리(이론)

혹시 강의 참고 자료는 없는걸까요?

  • spring
  • spring-boot
이샘미 댓글 1 좋아요 0 조회수 1104

module, controller, service, entity 생성 관계

미해결

탄탄한 백엔드 NestJS, 기초부터 심화까지

module 안에 controller, service가 포함되는 것으로 이해하고 있습니다. 예를 들어, 최초에 nest new 하면 user module/contoller/service 가 생성됩니다. 이후, 새로운 기능에 대해 nest cli 로 module을 생성해야 할지? controller를 생성해야 할지, 혹은 service를 생성해야 할지 고민이 됩니다. (역할이 있겠지만, 새로운 service를 만들때, 반드시 새로운 module 기반에서 새로운 service를 만들어야 하는 것인지 등등) entity를 포함하여, 디렉토리 tree도 어떻게 가져가는게 좋은지 권고 사항 있을까요? module, controller, service의 관계에 대한 질문 같기도 하구요, 설계관점 일지도 모르겠습니다. 새로운 화일(module, controller, service)을 생성할 때, 어떤 식으로 진행하는게 좋을지 문의 드립니다.

  • nodejs
  • express
  • mongodb
  • NestJS
  • ssr
유영기 댓글 1 좋아요 0 조회수 431

module, controller, service, entity 생성 관계

미해결

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

module 안에 controller, service가 포함되는 것으로 이해하고 있습니다. 예를 들어, 최초에 nest new 하면 user module/contoller/service 가 생성됩니다. 이후, 새로운 기능에 대해 nest cli 로 module을 생성해야 할지? controller를 생성해야 할지, 혹은 service를 생성해야 할지 고민이 됩니다. (역할이 있겠지만, 새로운 service를 만들때, 반드시 새로운 module 기반에서 새로운 service를 만들어야 하는 것인지 등등) entity를 포함하여, 디렉토리 tree도 어떻게 가져가는게 좋은지 권고 사항 있을까요? module, controller, service의 관계에 대한 질문 같기도 하구요, 설계관점 일지도 모르겠습니다. 새로운 화일(module, controller, service)을 생성할 때, 어떤 식으로 진행하는게 좋을지 문의 드립니다.

  • NestJS
  • TypeORM
  • nodejs
  • express
유영기 댓글 1 좋아요 0 조회수 489

익스프레스 미들웨어간 데이터 전송 시 질문 있습니다.

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

보통 하나의 요청 - 응답 사이클에서는 다음 미들웨어에게 데이터를 전송할 때 res.locals 에 담아서 보내는 것으로 알고 있습니다. 그런데 미니프로젝트에서 과제를 수행할 때 주민등록번호가 req.body 로 들어오게 되는데요. 이 때, 주민등록번호를 수정하고 다음 미들웨어로 전달 할 때는 req.body.personal 을 직접 수정하는 것이 좋나요? 아니면 res.locals 로 전달하는게 나을까요?

  • javascript
  • nodejs
  • docker
  • tdd
  • rest-api
  • express
  • NestJS
gigo96 댓글 1 좋아요 0 조회수 313

날짜변환 에러

미해결

단 두 장의 문서로 데이터 분석과 시각화 뽀개기

pd.to _datetime에서 왜 2020년도는 되는데, 2022년도는 에러가 나는지요? *정상동작: 2020년 print(pd.to_datetime("2020-"+df["확진일"].str.replace(".","-"))) *에려: 2022년 print(pd.to_datetime("2022-"+df["확진일"].str.replace(".","-"))) 세부 에러결과

  • pandas
  • python
lcw07 댓글 0 좋아요 0 조회수 294

member테이블 생성.강의-JPA와 DB 설정, 동작확인

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. ->여기에 member 테이블이 생성이 안돼요. memberRepository -> Download https://repo.maven.apache.org/maven2/org/projectlombok/lombok/1.18.22/lombok-1.18.22.pom , took 721 ms (1.48 kB) Download https://repo.maven.apache.org/maven2/org/projectlombok/lombok/1.18.22/lombok-1.18.22.jar , took 1 s 605 ms (1.95 MB) > Task :compileJava > Task :processResources UP-TO-DATE > Task :classes > Task :compileTestJava UP-TO-DATE > Task :processTestResources NO-SOURCE > Task :testClasses UP-TO-DATE > Task :test 06:07:24.485 [Test worker] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [MemberRepositoryTest]: using SpringBootContextLoader 06:07:24.497 [Test worker] DEBUG org.springframework.test.context.support .AbstractContextLoader - Could not detect default resource locations for test class [jpabook.jpashop.MemberRepositoryTest]: no resource found for suffixes {-context.xml, Context.groovy}. 06:07:24.499 [Test worker] INFO org.springframework.test.context.support .AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class [jpabook.jpashop.MemberRepositoryTest]: MemberRepositoryTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration. 06:07:24.552 [Test worker] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using ContextCustomizers for test class [MemberRepositoryTest]: [DisableObservabilityContextCustomizer, PropertyMappingContextCustomizer, Customizer, ExcludeFilterContextCustomizer, DuplicateJsonObjectContextCustomizer, MockitoContextCustomizer, TestRestTemplateContextCustomizer] 06:07:24.654 [Test worker] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider - Identified candidate component class: file [C:\jpashop\build\classes\java\main\jpabook\jpashop\JpashopApplication.class] 06:07:24.659 [Test worker] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration jpabook.jpashop.JpashopApplication for test class jpabook.jpashop.MemberRepositoryTest 06:07:24.770 [Test worker] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using TestExecutionListeners for test class [MemberRepositoryTest]: [ServletTestExecutionListener, DirtiesContextBeforeModesTestExecutionListener, ApplicationEventsTestExecutionListener, MockitoTestExecutionListener, DependencyInjectionTestExecutionListener, DirtiesContextTestExecutionListener, TransactionalTestExecutionListener, SqlScriptsTestExecutionListener, EventPublishingTestExecutionListener, RestDocsTestExecutionListener, MockRestServiceServerResetTestExecutionListener, MockMvcPrintOnlyOnFailureTestExecutionListener, WebDriverTestExecutionListener, MockWebServiceServerTestExecutionListener, ResetMocksTestExecutionListener] 06:07:24.772 [Test worker] DEBUG org.springframework.test.context.support .AbstractDirtiesContextTestExecutionListener - Before test class: class [MemberRepositoryTest], class annotated with @DirtiesContext [false] with mode [null] . ____ _ /\\ / ___'_ __ ( _)_ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.0.1) 2023-01-10T06:07:25.056+09:00 INFO 7064 --- [ Test worker] jpabook.jpashop.MemberRepositoryTest : Starting MemberRepositoryTest using Java 17.0.5 with PID 7064 (started by PC in C:\jpashop) 2023-01-10T06:07:25.057+09:00 INFO 7064 --- [ Test worker] jpabook.jpashop.MemberRepositoryTest : No active profile set, falling back to 1 default profile: "default" 2023-01-10T06:07:25.773+09:00 INFO 7064 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2023-01-10T06:07:25.801+09:00 INFO 7064 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 16 ms. Found 0 JPA repository interfaces. 2023-01-10T06:07:26.337+09:00 INFO 7064 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2023-01-10T06:07:26.672+09:00 INFO 7064 --- [ Test worker] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:fa15755d-1779-4e39-8761-6f8666e6b6b0 user=SA 2023-01-10T06:07:26.675+09:00 INFO 7064 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2023-01-10T06:07:26.741+09:00 INFO 7064 --- [ Test worker] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2023-01-10T06:07:26.833+09:00 INFO 7064 --- [ Test worker] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.1.6.Final 2023-01-10T06:07:27.138+09:00 WARN 7064 --- [ Test worker] org.hibernate.orm.deprecation : HHH90000021: Encountered deprecated setting [javax.persistence.sharedCache.mode], use [jakarta.persistence.sharedCache.mode] instead 2023-01-10T06:07:27.378+09:00 INFO 7064 --- [ Test worker] SQL dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 2023-01-10T06:07:28.468+09:00 INFO 7064 --- [ Test worker] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2023-01-10T06:07:28.487+09:00 INFO 7064 --- [ Test worker] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2023-01-10T06:07:28.768+09:00 WARN 7064 --- [ Test worker] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2023-01-10T06:07:29.060+09:00 INFO 7064 --- [ Test worker] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html] 2023-01-10T06:07:29.360+09:00 INFO 7064 --- [ Test worker] jpabook.jpashop.MemberRepositoryTest : Started MemberRepositoryTest in 4.529 seconds (process running for 6.173) 2023-01-10T06:07:29.899+09:00 INFO 7064 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2023-01-10T06:07:29.899+09:00 INFO 7064 --- [ionShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down' 2023-01-10T06:07:29.902+09:00 INFO 7064 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2023-01-10T06:07:29.905+09:00 INFO 7064 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. BUILD SUCCESSFUL in 12s 4 actionable tasks: 2 executed, 2 up-to-date 오전 6:07:30: Execution finished ':test --tests "jpabook.jpashop.MemberRepositoryTest"'.

  • spring
  • java
  • spring-boot
  • JPA
  • 웹앱
heidi 댓글 1 좋아요 0 조회수 2682

2309 뭐가 틀린건지 모르겠습니다.

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

재귀함수연습을 좀 해본다고 재귀함수로 콤비네이션을이용해서 짜봤는데 백준 질문 게시판에있는 예시들은 다 정답으로 나오는데 자꾸 틀렸다는데 이유를 모르겠네요.. #include <bits/stdc++.h> using namespace std; // 9명의 난쟁이 중에서 // 순서에 상관없이 2명을 고르고 전체에서 빼기 후 100이 되는걸 구하는 방법 // 재귀함수로 작성해보기 int input[9]; int sum; vector<int> temp; pair<int, int> ret; void Combination(int* arr, int start) { if (temp.size() == 2) { if ((sum - temp[0] - temp[1]) == 100) { ret = { temp[0], temp[1] }; return; } } for (int i = start + 1; i < 9; ++i) { temp.push_back(input[i]); Combination(arr, i); temp.pop_back(); } return; } int main() { for (int i = 0; i < 9; ++i) { cin >> input[i]; sum += input[i]; } sort(input, input + 9); Combination(input, -1); for (int i = 0; i < 9; ++i) { if (input[i] == ret.first || input[i] == ret.second) continue; cout << input[i] << '\n'; } }

  • C++
  • 코테 준비 같이 해요!
Windfall 댓글 1 좋아요 0 조회수 485

인기 태그

인프런 TOP Writers

주간 인기글