„Háttéralkalmazások/Záróvizsgatételek” változatai közötti eltérés
→7. Spring: Tétel kidolgozása |
a →5. JPA – általános: Magyarra átírás |
||
| (6 közbenső módosítás ugyanattól a felhasználótól nincs mutatva) | |||
| 71. sor: | 71. sor: | ||
!➖ | !➖ | ||
|- | |- | ||
|teljesítmény | |'''teljesítmény''' | ||
| | | | ||
* gyorsabb lokális feldolgozás | * gyorsabb lokális feldolgozás | ||
| 81. sor: | 81. sor: | ||
* nem lehet igazán jól skálázni | * nem lehet igazán jól skálázni | ||
|- | |- | ||
|szabvány | |'''szabvány''' | ||
| | | | ||
| | | | ||
| 90. sor: | 90. sor: | ||
* így nehezebben karbantartható a kód | * így nehezebben karbantartható a kód | ||
|- | |- | ||
|adatbiztonság | |'''adatbiztonság''' | ||
| | | | ||
* jobb megfelelés az ACID-elveknek | * jobb megfelelés az ACID-elveknek | ||
| 96. sor: | 96. sor: | ||
| | | | ||
|- | |- | ||
|az üzleti logika bárhonnan meghívhatja a szubrutinokat | |'''az üzleti logika bárhonnan meghívhatja a szubrutinokat''' | ||
| | | | ||
* növeli a kód újrafelhasználhatóságát | * növeli a kód újrafelhasználhatóságát | ||
| 121. sor: | 121. sor: | ||
!van mellékhatása? | !van mellékhatása? | ||
|- | |- | ||
|eljárás | |'''eljárás''' | ||
|🟠 lehet | |🟠 lehet | ||
|🟠 lehet | |🟠 lehet | ||
|- | |- | ||
|függvény | |'''függvény''' | ||
|🟢 igen, mindig | |🟢 igen, mindig | ||
|🔴 nem, soha | |🔴 nem, soha | ||
| 407. sor: | 407. sor: | ||
!előnyei | !előnyei | ||
|- | |- | ||
|automatikus | |'''automatikus''' | ||
|<syntaxhighlight lang="csharp" line="1">public class Book | |<syntaxhighlight lang="csharp" line="1">public class Book | ||
{ | { | ||
| 418. sor: | 418. sor: | ||
* a konvenciók alkalmazása kiváltja a további kód írását | * a konvenciók alkalmazása kiváltja a további kód írását | ||
|- | |- | ||
|annotációk | |'''annotációk''' | ||
|<syntaxhighlight lang="csharp" line="1"> | |<syntaxhighlight lang="csharp" line="1"> | ||
public class Book | public class Book | ||
| 434. sor: | 434. sor: | ||
* egyszerű, ismert szintaxis | * egyszerű, ismert szintaxis | ||
|- | |- | ||
|Fluent API | |'''Fluent API''' | ||
|<syntaxhighlight lang="csharp" line="1">protected override void OnModelCreating(ModelBuilder modelBuilder) | |<syntaxhighlight lang="csharp" line="1">protected override void OnModelCreating(ModelBuilder modelBuilder) | ||
{ | { | ||
| 455. sor: | 455. sor: | ||
!ki / mi készíti? | !ki / mi készíti? | ||
|- | |- | ||
|1. | |'''1.''' | ||
|OO-modell | |OO-modell | ||
| rowspan="2" |a fejlesztő C#-ban | | rowspan="2" |a fejlesztő C#-ban | ||
|- | |- | ||
|2. | |'''2.''' | ||
|ORM | |ORM | ||
|- | |- | ||
|3. | |'''3.''' | ||
|DB-objektumok | |DB-objektumok | ||
|EF Core Migration Tool | |EF Core Migration Tool | ||
| 473. sor: | 473. sor: | ||
!ki / mi készíti? | !ki / mi készíti? | ||
|- | |- | ||
|1. | |'''1.''' | ||
|DB-objektumok | |DB-objektumok | ||
|a fejlesztő SQL-ben | |a fejlesztő SQL-ben | ||
|- | |- | ||
|2. | |'''2.''' | ||
|ORM | |ORM | ||
| rowspan="2" |EF Core Reverse Engineering Tool | | rowspan="2" |EF Core Reverse Engineering Tool | ||
|- | |- | ||
|3. | |'''3.''' | ||
|OO-modell | |OO-modell | ||
|} | |} | ||
=== Hogy néz ki egy entitás, hogyan készítünk kapcsolatokat közöttük? === | === Hogy néz ki egy entitás, hogyan készítünk kapcsolatokat közöttük? === | ||
| 494. sor: | 492. sor: | ||
!N:N | !N:N | ||
|- | |- | ||
|annotációkkal | |'''annotációkkal''' | ||
|Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | |Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | ||
{ | { | ||
| 547. sor: | 545. sor: | ||
}</syntaxhighlight> | }</syntaxhighlight> | ||
|- | |- | ||
|Fluent API-val | |'''Fluent API-val''' | ||
|Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | |Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | ||
{ | { | ||
| 643. sor: | 641. sor: | ||
!<code>dbContext</code>-függvényhívás | !<code>dbContext</code>-függvényhívás | ||
|- | |- | ||
|create | |'''create''' | ||
|<code>.Dogs.Add(newDog);</code> | |<code>.Dogs.Add(newDog);</code> | ||
|- | |- | ||
|read | |'''read''' | ||
|ld. az előző táblázatot | |ld. az előző táblázatot | ||
|- | |- | ||
|update | |'''update''' | ||
|<code>.Dogs.Find(dogId);</code> | |<code>.Dogs.Find(dogId);</code> | ||
<code>dog.BirthDate = birthDate;</code> | <code>dog.BirthDate = birthDate;</code> | ||
|- | |- | ||
|delete | |'''delete''' | ||
|adatbetöltéssel: | |adatbetöltéssel: | ||
<code>.Dogs.Find(dogId);</code> | <code>.Dogs.Find(dogId);</code> | ||
| 742. sor: | 740. sor: | ||
!létezik | !létezik | ||
|- | |- | ||
| rowspan="2" |a memóriában (perzisztenciakontextusban) | | rowspan="2" |'''a memóriában (perzisztenciakontextusban)''' | ||
|nem létezik | |'''nem létezik''' | ||
|– | |– | ||
|'' | |''lecsatolt'' | ||
|- | |- | ||
|létezik | |'''létezik''' | ||
|'' | |''új'' | ||
|'' | |''menedzselt'' vagy ''törölt'' | ||
|} | |} | ||
| 793. sor: | 791. sor: | ||
!példa | !példa | ||
|- | |- | ||
|egyszerű | |'''egyszerű''' | ||
|elsődleges kulcs alapján | |'''elsődleges kulcs alapján''' | ||
|<syntaxhighlight lang="java" line="1">Person p = entityManager.find(Person.class, 42L);</syntaxhighlight> | |<syntaxhighlight lang="java" line="1">Person p = entityManager.find(Person.class, 42L);</syntaxhighlight> | ||
|- | |- | ||
| rowspan="2" |feltételekkel | | rowspan="2" |'''feltételekkel''' | ||
|Criteria API | |'''Criteria API''' | ||
|<syntaxhighlight lang="java" line="1">CriteriaBuilder cb = entityManager.getCriteriaBuilder(); | |<syntaxhighlight lang="java" line="1">CriteriaBuilder cb = entityManager.getCriteriaBuilder(); | ||
CriteriaQuery<Person> cq = cb.createQuery(Person.class); | CriteriaQuery<Person> cq = cb.createQuery(Person.class); | ||
| 808. sor: | 806. sor: | ||
Person p = entityManager.createQuery(cq).getSingleResult();</syntaxhighlight> | Person p = entityManager.createQuery(cq).getSingleResult();</syntaxhighlight> | ||
|- | |- | ||
|Query by Example<ref>Nem tananyag, de Tanár Úr jelezte, hogy a Java 2. házit ennek segítségével lehet megoldani legszebben.</ref> | |'''Query by Example<ref>Nem tananyag, de Tanár Úr jelezte, hogy a Java 2. házit ennek segítségével lehet megoldani legszebben.</ref>''' | ||
|<syntaxhighlight lang="java" line="1">Person probe = new Person(); | |<syntaxhighlight lang="java" line="1">Person probe = new Person(); | ||
ExampleMatcher matcher = ExampleMatcher | ExampleMatcher matcher = ExampleMatcher | ||
| 819. sor: | 817. sor: | ||
List<Person> results = repo.findAll(example);</syntaxhighlight> | List<Person> results = repo.findAll(example);</syntaxhighlight> | ||
|- | |- | ||
| rowspan="2" |nyersen | | rowspan="2" |'''nyersen''' | ||
''(el is lehet nevezni őket)'' | '''''(el is lehet nevezni őket)''''' | ||
|JPQL | |'''JPQL''' | ||
|<syntaxhighlight lang="java" line="1">TypedQuery<Person> q = entityManager.createQuery( | |<syntaxhighlight lang="java" line="1">TypedQuery<Person> q = entityManager.createQuery( | ||
"SELECT p FROM Person p WHERE p.age > :age", Person.class | "SELECT p FROM Person p WHERE p.age > :age", Person.class | ||
| 829. sor: | 827. sor: | ||
List<Person> list = q.getResultList();</syntaxhighlight> | List<Person> list = q.getResultList();</syntaxhighlight> | ||
|- | |- | ||
|SQL | |'''SQL''' | ||
|<syntaxhighlight lang="java" line="1">List<Object[]> rows = entityManager.createNativeQuery( | |<syntaxhighlight lang="java" line="1">List<Object[]> rows = entityManager.createNativeQuery( | ||
"SELECT first_name, last_name FROM person WHERE age > :min" | "SELECT first_name, last_name FROM person WHERE age > :min" | ||
| 848. sor: | 846. sor: | ||
!miben segít? | !miben segít? | ||
|- | |- | ||
|repositoryk | |'''repositoryk''' | ||
használata | '''használata''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
interface BusRepository extends JpaRepository<Bus, Long> { } | interface BusRepository extends JpaRepository<Bus, Long> { } | ||
| 857. sor: | 855. sor: | ||
* kevesebb boilerplate kód | * kevesebb boilerplate kód | ||
|- | |- | ||
|konvenciók | |'''konvenciók''' | ||
használata | '''használata''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
List<Bus> findByLpn(String lpn); | List<Bus> findByLpn(String lpn); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|rendezés | |'''rendezés''' | ||
és lapozás | '''és lapozás | ||
támogatása | támogatása''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
interface BusRepository extends PagingAndSortingRepository<Bus, Long> { | interface BusRepository extends PagingAndSortingRepository<Bus, Long> { | ||
| 875. sor: | 873. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|egyedi | |'''egyedi''' | ||
lekérdezés | '''lekérdezés''' | ||
|<syntaxhighlight lang="java" line="1">@Query("SELECT DISTINCT b FROM Bus b WHERE b.lpn LIKE :lpn")</syntaxhighlight> | |<syntaxhighlight lang="java" line="1">@Query("SELECT DISTINCT b FROM Bus b WHERE b.lpn LIKE :lpn")</syntaxhighlight> | ||
| | | | ||
* hosszú metódusnevek helyett kézzel meg lehet írni, és a kívánt nevet lehet adni a metódusnak | * hosszú metódusnevek helyett kézzel meg lehet írni, és a kívánt nevet lehet adni a metódusnak | ||
|} | |} | ||
=== Hogyan valósíthatók meg entitások közti kapcsolatok és az entitások öröklése JPA-ban? === | === Hogyan valósíthatók meg entitások közti kapcsolatok és az entitások öröklése JPA-ban? === | ||
| 893. sor: | 889. sor: | ||
!kétirányú | !kétirányú | ||
|- | |- | ||
|<code>@OneToOne</code> | |<code>'''@OneToOne'''</code> | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Entity | @Entity | ||
| 923. sor: | 919. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|<code>@OneToMany</code> | |<code>'''@OneToMany'''</code> | ||
és | '''és | ||
<code>@ManyToOne</code> | <code>@ManyToOne</code>''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Entity | @Entity | ||
| 957. sor: | 953. sor: | ||
}</syntaxhighlight> | }</syntaxhighlight> | ||
|- | |- | ||
|<code>@ManyToMany</code> | |<code>'''@ManyToMany'''</code> | ||
|<syntaxhighlight lang="java" line="1">@Entity | |<syntaxhighlight lang="java" line="1">@Entity | ||
class A { | class A { | ||
| 1 008. sor: | 1 004. sor: | ||
!<code>@Inheritance(strategy = …)</code> | !<code>@Inheritance(strategy = …)</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Egy táblába, gányul|egy táblába, gányul]] | |[[Háttéralkalmazások/Záróvizsgatételek#Egy táblába, gányul|'''egy táblába, gányul''']] | ||
|<code>SINGLE_TABLE</code> | |<code>SINGLE_TABLE</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába a valós osztályokat|külön táblába a valós osztályokat]] | |[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába a valós osztályokat|'''külön táblába a valós osztályokat''']] | ||
|<code>TABLE_PER_CLASS</code> | |<code>TABLE_PER_CLASS</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába az összes osztályt|külön táblába az összes osztályt]] | |[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába az összes osztályt|'''külön táblába az összes osztályt''']] | ||
|<code>JOINED</code> | |<code>JOINED</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Absztrakt struktúrába|absztrakt struktúrába]] | |[[Háttéralkalmazások/Záróvizsgatételek#Absztrakt struktúrába|'''absztrakt struktúrába''']] | ||
|– | |– | ||
|} | |} | ||
| 1 040. sor: | 1 036. sor: | ||
A következő annotációkkal: | A következő annotációkkal: | ||
{| class="wikitable mw-collapsible mw-collapsed" | {| class="wikitable mw-collapsible mw-collapsed" | ||
|+Opciók a legrosszabbtól a legjobbig | |+Opciók (a legrosszabbtól a legjobbig) | ||
!lehet injektálni | !lehet injektálni | ||
!példa | !példa | ||
|- | |- | ||
|mezőbe | |'''mezőbe''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Service | @Service | ||
| 1 059. sor: | 1 055. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|setterbe | |'''setterbe''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Service | @Service | ||
| 1 077. sor: | 1 073. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|konstruktorba | |'''konstruktorba''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Service | @Service | ||
| 1 099. sor: | 1 095. sor: | ||
=== Milyen élettartama lehet egy springes beannek? === | === Milyen élettartama lehet egy springes beannek? === | ||
{| class="wikitable" | {| class="wikitable" | ||
|+Scope-ok a leghosszabbtól a legrövidebb életűig | |+Scope-ok (a leghosszabbtól a legrövidebb életűig) | ||
!típus | !típus | ||
!annotáció | !annotáció | ||
!minek az életciklusához van kötve | !minek az életciklusához van kötve | ||
|- | |- | ||
|singleton | |'''singleton''' | ||
|''– (ez az alapértelmezett)'' | |''– (ez az alapértelmezett)'' | ||
|semminek, csak egy van belőle az egész alkalmazásban | |semminek, csak egy van belőle az egész alkalmazásban | ||
|- | |- | ||
|application | |'''application''' | ||
|<code>@Scope("application")</code> | |<code>@Scope("application")</code> | ||
|<code>ServletContext</code><ref>Webalkalmazásoknál használatos.</ref> | |<code>ServletContext</code><ref>Webalkalmazásoknál használatos.</ref> | ||
|- | |- | ||
|prototype | |'''prototype''' | ||
|<code>@Scope("prototype")</code> | |<code>@Scope("prototype")</code> | ||
|új példány jön létre minden <code>getBean()</code> (<code>@Autowired</code>) hívásra | |új példány jön létre minden <code>getBean()</code> (<code>@Autowired</code>) hívásra | ||
|- | |- | ||
|websocket | |'''websocket''' | ||
|<code>@Scope(scopeName="websocket", proxyMode=...)</code> | |<code>@Scope(scopeName="websocket", proxyMode=...)</code> | ||
|<code>WebSocket</code> session | |<code>WebSocket</code> session | ||
|- | |- | ||
|session | |'''session''' | ||
|<code>@Scope("session")</code> | |<code>@Scope("session")</code> | ||
|HTTP session | |HTTP session | ||
|- | |- | ||
|request | |'''request''' | ||
|<code>@Scope("request")</code> | |<code>@Scope("request")</code> | ||
|HTTP-kérés | |HTTP-kérés | ||
|} | |} | ||
=== Hogyan könnyíti meg a JPA használatát a Spring Data JPA? === | === [[Háttéralkalmazások/Záróvizsgatételek#Hogyan bővíti a lehetőségeket a Spring Data JPA a lekérdezések megfogalmazásának területén?|Hogyan könnyíti meg a JPA használatát a Spring Data JPA?]] === | ||
... | === Hogyan támogatja a tranzakciókezelést a Spring? === | ||
Egységes API-ja van, ami mögé ezeket a tranzakciókezelőket lehet berakni: | |||
{| class="wikitable" | |||
|+Tranzakciókezelők (az alacsonyabb szinttől a magasabbig) | |||
!típus | |||
!jellemzői | |||
|- | |||
|'''JDBC''' | |||
|– | |||
|- | |||
|'''EntityTransaction (JPA)''' | |||
|ld.: ''[[Háttéralkalmazások/Záróvizsgatételek#Ismertesd a Java Persistence API architektúráját és főbb jellemzőit!|Ismertesd a Java Persistence API architektúráját és főbb jellemzőit!]]'' | |||
|- | |||
|'''JDO (Java Data Objects)''' | |||
|a ''JTA'' elődje | |||
|- | |||
|'''JTA (Jakarta Transactions)''' | |||
|szolgáltatásokon átívelő tranzakciókat lehet végrehajtani | |||
|} | |||
{| class="wikitable" | |||
|+Tranzakciókezelés módjai (a kevésbé népszerűtől a népszerűbbig) | |||
!típus | |||
!hogyan indítjuk / | |||
zárjuk le a tranzakciókat? | |||
!példa | |||
|- | |||
|'''programozott''' | |||
|a kódban | |||
|<syntaxhighlight lang="java" line="1"> | |||
@Service | |||
public class OrderService { | |||
private final PlatformTransactionManager transactionManager; | |||
public OrderService(PlatformTransactionManager transactionManager) { | |||
this.transactionManager = transactionManager; | |||
} | |||
public void processOrder() { | |||
TransactionStatus transactionStatus = transactionManager | |||
.getTransaction(new DefaultTransactionDefinition()); | |||
try { | |||
validateOrder(); | |||
chargeCustomer(); | |||
saveOrderToDatabase(); | |||
transactionManager.commit(transactionStatus); | |||
System.out.println("Transaction committed successfully!"); | |||
} catch (RuntimeException ex) { | |||
transactionManager.rollback(transactionStatus); | |||
System.out.println( | |||
"Transaction was rolled back due to the following error: " + ex.getMessage() | |||
); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
|- | |||
|'''deklaratív''' | |||
|metódusannotációkkal | |||
|<syntaxhighlight lang="java" line="1"> | |||
@Service | |||
public class OrderService { | |||
@Transactional | |||
public void processOrder() { | |||
validateOrder(); | |||
chargeCustomer(); | |||
saveOrderToDatabase(); | |||
// kezeletlen kivétel esetén a Spring automatikusan rollbackel | |||
} | |||
} | |||
</syntaxhighlight> | |||
|} | |||
{| class="wikitable" | |||
|+A <code>@Transactional</code> paraméterei | |||
!paraméter | |||
!értéke | |||
|- | |||
|<code>(no)rollbackFor(ClassName)</code> | |||
|milyen kivételek esetén legyen rollback | |||
|- | |||
|<code>timeout</code> | |||
|az időkorlát másodpercben | |||
|- | |||
|<code>isolation</code> | |||
|izolációs szint (a JPA nem támogatja) | |||
|- | |||
|<code>value</code> | |||
|a tranzakciókezelő azonosítója (több adatbázis esetén fontos) | |||
|- | |||
|<code>propagation</code> | |||
|kompatibilitás egy tranzakcionális metódusból hívott másik tranzakcionális metódussal | |||
|} | |||
{| class="wikitable" | |||
|+A <code>propagation</code> értékei (a megengedőbbtől a szigorúbbig) | |||
! rowspan="2" |érték | |||
! colspan="2" |mit tesz a jelenlegi függvény... | |||
! colspan="2" |mi történik a következő függvénnyel? | |||
|- | |||
!...ha van aktív tranzakció? | |||
!...ha nincs aktív tranzakció? | |||
!...ha van aktív tranzakció? | |||
!...ha nincs aktív tranzakció? | |||
|- | |||
|'''<code>REQUIRED</code>''' | |||
(alapértelmezett) | |||
|azt folytatja | |||
|újat hoz létre | |||
|a jelenlegit folytatja | |||
|– | |||
|- | |||
|'''<code>NESTED</code>''' | |||
|folytatódik, és egy <code>SAVEPOINT</code>-ot hoz létre | |||
|újat hoz létre | |||
|a jelenlegit folytatja – rollback esetén csak a <code>SAVEPOINT</code>-ig áll vissza | |||
|– | |||
|- | |||
|'''<code>REQUIRES_NEW</code>''' | |||
|felfüggeszti | |||
|újat hoz létre | |||
|új tranzakciót használ | |||
|– | |||
|- | |||
|'''<code>SUPPORTS</code>''' | |||
|azt folytatja | |||
|tranzakció nélkül fut | |||
|azt folytatja | |||
|tranzakció nélkül fut | |||
|- | |||
|'''<code>MANDATORY</code>''' | |||
|azt folytatja | |||
|kivételt dob | |||
|azt folytatja | |||
|– | |||
|- | |||
|'''<code>NOT_SUPPORTED</code>''' | |||
|felfüggeszti | |||
|– | |||
|– | |||
|tranzakció nélkül fut | |||
|- | |||
|'''<code>NEVER</code>''' | |||
|kivételt dob | |||
|tranzakció nélkül fut | |||
|– | |||
|tranzakció nélkül fut | |||
|} | |||
== 8. ASP.NET Core == | == 8. ASP.NET Core == | ||
{{Átnézendő szakasz}} | |||
=== Mi az ASP.NET Core? === | === Mi az ASP.NET Core? === | ||
... | Az ASP.NET Core egy .NET-alapú nagyteljesítményű, nyílt forráskódú, platformfüggetlen webalkalmazás‑framework. | ||
=== Mit jelent, hogy egy alkalmazás monolitikus? === | === Mit jelent, hogy egy alkalmazás monolitikus? === | ||
... | Monolitikusnak nevezzük azt az alkalmazást, amelynek összes komponense – pl. UI, üzleti logika és adatkezelés – egyetlen deploy‑egységben (pl. egy futtatható vagy szerveralkalmazásban) fut, nem részeire bontva. | ||
=== Mi a ''clean architecture''? === | === Mi a ''clean architecture''? === | ||
... | A clean architecture egy szoftvertervezési minta, melynek alapvetése a kód rétegekre (pl. domain, application, infrastructure, presentation) bontása. Alkalmazza a dependency inversiont is: a külső rétegek függnek csak az absztrakcióktól, nem fordítva. | ||
=== Sorolj fel min. 3 általános ASP.NET Core által nyújtott | === Sorolj fel min. 3 általános, ASP.NET Core által nyújtott infrastruktúrafunkciót! === | ||
... | * beépített DI | ||
* middleware alapú HTTP–pipeline-kezelés (pl. autentikáció, logging) | |||
* konfigurálhatóság (<code>appsettings.json</code> + környezeti változók) | |||
* moduláris hosting (pl. Kestrel), cross‑platform deployment (IIS, Nginx, Docker stb.) | |||
=== Hogyan indul el egy ASP.NET Core projekt? === | === Hogyan indul el egy ASP.NET Core projekt? === | ||
.. | # <code>dotnet new webapi</code> vagy <code>dotnet new mvc</code> parancs | ||
# a <code>Program.cs</code> és/vagy <code>Startup.cs</code> definiálja a hosztot, regisztrálja a service‑eket és a middleware‑eket | |||
# a <code>dotnet run</code> indítja el a Kestrel szervert | |||
# elérhető az alkalmazás | |||
=== Milyen lépései vannak, hogy egy Web API-n kiajánljunk egy EF Core által nyújtott adatmodellt (lekérdezésre, módosításra)? === | === Milyen lépései vannak, hogy egy Web API-n kiajánljunk egy EF Core által nyújtott adatmodellt (lekérdezésre, módosításra)? === | ||
... | # projekt generálása (<code>dotnet new webapi</code>) | ||
# EF Core-csomagok telepítése (<code>Microsoft.EntityFrameworkCore</code>, SQL server provider) | |||
# <code>DbContext</code> osztály és entitásmodellek létrehozása | |||
# <code>AddDbContext<...>(...)</code> DI a <code>Program.cs</code>-ben / <code>Startup.cs</code>-ben | |||
# kontroller létrehozása (<code>ApiController</code>), mely injektálja a <code>DbContext</code>‑et | |||
# lekérdező metódusok írása: <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>DELETE</code> endpointok | |||
# használat: <code>context.Entities.ToList()</code>, <code>Find(id)</code>, <code>Add()</code>, <code>Update()</code>, <code>Remove()</code>, majd <code>SaveChanges()</code> | |||
== 9. Razor == | == 9. Razor == | ||
{{Átnézendő szakasz}} | |||
=== Milyen módokon szeparálhatjuk a kliens–szerver alkalmazásrétegeket? === | === Milyen módokon szeparálhatjuk a kliens–szerver alkalmazásrétegeket? === | ||
... | * tiszta szerveroldali renderelés – minden HTML generálását a szerver végzi (pl. ASP.NET MVC, Razor Pages). | ||
* tiszta kliensoldali alkalmazás (SPA) – az UI a böngészőben fut, a szerveren csak API-szolgáltatás van (pl. Angular, React). | |||
* hibrid megközelítés – a kezdeti renderelés szerveren történik, utána a kliens veszi át az irányítást (Pl. Blazor Server, SSR + CSR kombinációk) | |||
=== Mi a szerveroldali renderelés? === | === Mi a szerveroldali renderelés? === | ||
. | A szerver generálja az egész HTML-t a kérésre, és küldi el a kliensnek. Így a böngésző azonnal meg tudja jeleníteni a teljes oldalt. | ||
=== Milyen előnyei/hátrányai vannak a kliensoldalival szemben? === | === Milyen előnyei/hátrányai vannak a kliensoldalival szemben? === | ||
==== Előnyök ==== | |||
* gyorsabb első betöltés – kész HTML érkezik | |||
* jobb SEO-támogatás | |||
==== Hátrányok ==== | |||
* magasabb szerverterhelés, minden kérésnél újrarenderelés | |||
* lassabb interaktivitás és navigáció a teljes oldalletöltések miatt | |||
=== Mi a Razor? === | === Mi a Razor? === | ||
... | A Razor egy HTML-templating szintaxis C# (vagy VB) integrálásával; 2010 óta része az ASP.NET MVC-nek / ASP.NET Core‑nak. <code>.cshtml</code> / <code>.razor</code> fájlokban használatos. | ||
=== Hogyan készül el egy HTML-oldal Razor segítségével és MVC vagy Razor Pages használatával? === | === Hogyan készül el egy HTML-oldal Razor segítségével és MVC vagy Razor Pages használatával? === | ||
==== MVC ==== | |||
# létre kell hozni egy <code>Controller</code> metódust return <code>View(model);</code>-lel | |||
# a <code>ViewName.cshtml</code> fájlban Razor-kód (<code>@model</code>, <code>@foreach</code> stb.) generálja a HTML-t | |||
==== Razor Pages ==== | |||
# létre kell hozni egy <code>.cshtml</code> fájlpárt (<code>Index.cshtml</code> + <code>Index.cshtml.cs</code>), ahol: | |||
## a <code>*.cshtml.cs</code> tartalmazza az oldal logikáját az <code>OnGet()</code> és <code>OnPost()</code> metódusokkal | |||
## a <code>*.cshtml</code> Razor-jelölésekkel hivatkozik a <code>@Model</code> objektumra | |||
== 10. Microservices == | == 10. Microservices == | ||
| 1 365. sor: | 1 539. sor: | ||
=== A számítási felhő fő jellemzői === | === A számítási felhő fő jellemzői === | ||
* önkiszolgálás bármikor | |||
* nagy rugalmasság | |||
** skálázhatóság | |||
*** akár egy komplex vállalati rendszer is kialakítható | |||
** számlázás fogyasztás alapján | |||
* felhasználók közt megosztott erőforrások | |||
* széleskörű hálózati elérés | |||
** internet | |||
** IoT | |||
=== A számítási felhő fizikai, térbeli kiépítése === | === A számítási felhő fizikai, térbeli kiépítése === | ||
==== Fizikai ==== | |||
* nagy, légkondicionált raktárépületek | |||
* bennük általában már "csak" előreszerelt konténerekkel | |||
==== Térbeli ==== | |||
A nagyobbtól a kisebbig: | |||
* region | |||
* availability zone | |||
** redundancia | |||
* data center | |||
=== Főbb publikus felhőszolgáltatók === | === Főbb publikus felhőszolgáltatók === | ||
* AWS | |||
* Microsoft Azure | |||
* Google Cloud | |||
* OVH (EU) | |||
=== Felhős szolgáltatásmodellek === | === Felhős szolgáltatásmodellek === | ||
. | |||
* infrastructure as a service | |||
* platform as a service | |||
* software as a service | |||
{| class="wikitable" | |||
|+Üzemeltetési modellek (a más által kezelttől a saját kezelésűig) | |||
!típus | |||
!jellemzői | |||
!példa | |||
|- | |||
|nyilvános | |||
| | |||
* más által üzemeltetett | |||
* szabadon elérhető | |||
|ld.: ''[[Háttéralkalmazások/Záróvizsgatételek#Főbb publikus felhőszolgáltatók|Főbb publikus felhőszolgáltatók]]'' | |||
|- | |||
|hibrid | |||
| | |||
* nyilvános szolgáltatás | |||
* saját környezetben | |||
|Azure Stack Hub, AWS Outposts | |||
|- | |||
|közösségi | |||
| | |||
* egy csoport tagjai közt megosztott, zárt infrastruktúra | |||
|EESZT | |||
|- | |||
|saját | |||
| | |||
* saját szolgáltatás | |||
* saját környezetben | |||
|– | |||
|} | |||
=== Szolgáltatásgaranciák (SLA) === | === Szolgáltatásgaranciák (SLA) === | ||
* magas uptime | |||
* redundancia | |||
** áramellátás | |||
** hálózat | |||
** hardver | |||
*** tárhely | |||
** földrajzi | |||
*** természeti katasztrófák | |||
=== Skálázási lehetőségek === | === Skálázási lehetőségek === | ||
* vertikális | |||
** erőforrások növelése | |||
* horizontális | |||
** példányok bővítése | |||
* automatikusan is lehet | |||
=== Példák elérhető szolgáltatásokra === | === Példák elérhető szolgáltatásokra === | ||
* AWS | |||
** S3 | |||
** SQS | |||
** EC2 | |||
* Google | |||
** Pub/Sub | |||
=== A felhős modell előnyei, hátrányai === | === A felhős modell előnyei, hátrányai === | ||
{| class="wikitable" | |||
|+Összehasonlítás | |||
!előny | |||
!hátrány | |||
|- | |||
|költséghatékony | |||
|drágább is lehet | |||
|- | |||
|használatalapú árazás | |||
|bonyolult árazás | |||
|- | |||
|könnyen skálázható | |||
|nem végtelenül skálázható | |||
|- | |||
|SLA | |||
|a nagyon magas SLA-kért többet kell fizetni | |||
|- | |||
|menedzselt üzemeltetés és biztonság (DRP) | |||
|nem férünk hozzá fizikailag a szerverekhez | |||
|- | |||
|globális | |||
|helyi adatvédelmi megfelelőség esetleges hiánya | |||
|- | |||
|sokféle szolgáltatás | |||
|vendor lock-in (breaking changes) | |||
|} | |||
== 13. Azure == | == 13. Azure == | ||
{{Átnézendő szakasz}} | |||
=== Azure alapszolgáltatások viszonya egymáshoz === | === Azure alapszolgáltatások viszonya egymáshoz === | ||
==== Előfizetés ==== | ==== Előfizetés ==== | ||
Azure-szolgáltatások igénybevételének elszámolási és hozzáférési egysége; egy Azure-fiók alatt több előfizetés is lehet, és az éves költési korlátok is erre épülnek. | |||
==== AD ==== | ==== AD ==== | ||
Identitás- és jogosultságkezelés központja, amelyhez előfizetések, felhasználók és szolgáltatások (alkalmazásregisztrációk) kapcsolódnak. | |||
==== Fiók (account) ==== | ==== Fiók (account) ==== | ||
Microsoft-fiók vagy szervezeti (Azure AD) fiók, amellyel be lehet jelentkezni és kapcsolatba lehet hozni az Azure-előfizetéseket. | |||
==== Erőforráscsoport ==== | ==== Erőforráscsoport ==== | ||
. | Logikai gyűjtőkonténer az előfizetésen belül, amelybe kapcsolódó erőforrásokat, pl. VM-eket vagy adatbázisokat csoportosítunk; segíti az RBAC-t és a költségkövetést. | ||
==== Erőforrás ==== | ==== Erőforrás ==== | ||
. | Valós szolgáltatásobjektum (pl. virtuális gép, tárhely, SQL-adatbázis), amely egy előfizetésen belül erőforráscsoportban jön létre. | ||
=== Erőforrások beállítható alapjellemzői === | === Erőforrások beállítható alapjellemzői === | ||
.. | * '''név''' – globálisan vagy az előfizetésen belül egyedi azonosító | ||
* '''régió''' – földrajzi hely (pl. <code>eastus</code>, <code>westeurope</code>) | |||
* '''típus és SKU''' – szolgáltatás rétegének és teljesítményének kiválasztása (pl. basic, standard) | |||
* '''címkék''' – kulcs–érték párok a költség- és szervezési szempontú csoportosításhoz | |||
=== Régió kiválasztásának szempontjai === | === Régió kiválasztásának szempontjai === | ||
. | * késleltetés | ||
* szabályozás és megfelelőség | |||
** egyes adattípusokra helyhez kötött tárolási előírások vonatkozhatnak | |||
* elérhetőség | |||
** nem minden régió támogat minden szolgáltatást. | |||
* költségek | |||
** régiónként eltérő árszintek lehetnek. | |||
=== Azure SQL és Azure App Service szolgáltatások... === | === Azure SQL és Azure App Service szolgáltatások... === | ||
==== ...bemutatása. ==== | ==== ...bemutatása. ==== | ||
... | * '''Azure SQL Database:''' teljesen menedzselt relációsadatbázis-szolgáltatás automatikus mentéssel, patcheléssel, méretezéssel és beépített teljesítményoptimalizálással. | ||
* '''Azure App Service:''' PaaS típusú app hosting szolgáltatás .NET, Java, Node.js, Python stb. számára. Könnyen skálázható és CI/CD-támogatott. | |||
==== ...felépítése (logikai) erőforrások szintjén. ==== | ==== ...felépítése (logikai) erőforrások szintjén. ==== | ||
* '''Azure SQL''': logikai SQL-szerver → adatbázis(ok) (→ Elastic Pool) | |||
* '''Azure App Service''': App Service Plan (compute és scale) → Web App → deployment slots, konfigurációk stb. | |||
==== ...árazási tényezői. ==== | ==== ...árazási tényezői. ==== | ||
* '''Azure SQL''': vCore- vagy DTU-alapú teljesítmény, adattárolás mérete, elérhetőség (zóna-redundancia), licencek (Azure Hybrid Benefit) | |||
* '''App Service''': service plan típusa (free, shared, basic, standard, premium, isolated), példányszám, skálázás típusa (manual, autoscale), operációs rendszer (Windows / Linux) | |||